import { getSheetIndex, getRangetxt } from "../methods/get";
import {
    replaceHtml,
    getObjType,
    ABCatNum,
    numFormat,
    numfloatlen,
    showrightclickmenu,
    mouseclickposition,
} from "../utils/util";
import { getdatabyselectionD, getcellvalue, datagridgrowth } from "../global/getdata";
import { isdatetime, diff, isdatatypemulti, isdatatype } from "../global/datecontroll";
import { genarate, update } from "../global/format";
import { isRealNull, isEditMode } from "../global/validate";
import { orderbydata1D } from "../global/sort";
import { jfrefreshgrid, jfrefreshgridall } from "../global/refresh";
import tooltip from "../global/tooltip";
import editor from "../global/editor";
import cleargridelement from "../global/cleargridelement";
import luckysheetArray from "../global/array";
import analysis from "../global/analysis";
import { selectHightlightShow } from "./select";
import { luckysheet_searcharray } from "./sheetSearch";
import {
    modelHTML,
    filtermenuHTML,
    filtersubmenuHTML,
    pivottableconfigHTML,
    pivottablesumHTML,
    luckysheetPivotTableHTML,
} from "./constant";
import sheetmanage from "./sheetmanage";
import luckysheetsizeauto from "./resize";
import server from "./server";
import { checkProtectionAuthorityNormal } from "./protection";
import Store from "../store";
import locale from "../locale/locale";
import numeral from "numeral";
import { luckysheetlodingHTML } from "../controllers/constant";

const pivotTable = {
    pivotDatas: null,
    pivotSheetIndex: 0,
    pivotDataSheetIndex: 0,
    celldata: null,
    origindata: null,
    getCellData: function(cursheetindex, datasheetindex, data_select_save) {
        let _this = this;

        let sheetIndex;
        if (cursheetindex != null) {
            sheetIndex = cursheetindex;
        } else {
            sheetIndex = Store.currentSheetIndex;
        }

        let realIndex = getSheetIndex(sheetIndex);

        if (getObjType(Store.luckysheetfile[realIndex].pivotTable) != "object") {
            Store.luckysheetfile[realIndex].pivotTable = new Function(
                "return " + Store.luckysheetfile[realIndex].pivotTable,
            )();
        }

        if (Store.luckysheetfile[realIndex].pivotTable != null) {
            _this.column = Store.luckysheetfile[realIndex].pivotTable.column;
            _this.row = Store.luckysheetfile[realIndex].pivotTable.row;
            _this.values = Store.luckysheetfile[realIndex].pivotTable.values;
            _this.filter = Store.luckysheetfile[realIndex].pivotTable.filter;
            _this.showType = Store.luckysheetfile[realIndex].pivotTable.showType;

            _this.filterparm = Store.luckysheetfile[realIndex].pivotTable.filterparm;

            if (Store.luckysheetfile[realIndex].pivotTable.drawPivotTable != null) {
                _this.drawPivotTable = Store.luckysheetfile[realIndex].pivotTable.drawPivotTable;
            } else {
                _this.drawPivotTable = true;
            }

            if (Store.luckysheetfile[realIndex].pivotTable.pivotTableBoundary != null) {
                _this.pivotTableBoundary = Store.luckysheetfile[realIndex].pivotTable.pivotTableBoundary;
            } else {
                _this.pivotTableBoundary = [12, 6];
            }

            if (data_select_save != null) {
                _this.pivot_select_save = data_select_save;
            } else {
                _this.pivot_select_save = Store.luckysheetfile[realIndex].pivotTable.pivot_select_save;
            }

            if (datasheetindex != null) {
                _this.pivotDataSheetIndex = datasheetindex;
            } else {
                _this.pivotDataSheetIndex = Store.luckysheetfile[realIndex].pivotTable.pivotDataSheetIndex;
            }
        } else {
            _this.column = null;
            _this.row = null;
            _this.values = null;
            _this.filter = null;
            _this.showType = null;

            _this.filterparm = null;

            _this.drawPivotTable = true;
            _this.pivotTableBoundary = [12, 6];

            if (data_select_save != null) {
                _this.pivot_select_save = data_select_save;
            } else {
                _this.pivot_select_save = Store.luckysheet_select_save;
            }

            if (datasheetindex != null) {
                _this.pivotDataSheetIndex = datasheetindex;
            } else {
                _this.pivotDataSheetIndex = sheetIndex;
            }
        }

        let pivotrealIndex = getSheetIndex(_this.pivotDataSheetIndex);

        let otherfile = Store.luckysheetfile[pivotrealIndex];
        if (otherfile["data"] == null) {
            otherfile["data"] = sheetmanage.buildGridData(otherfile);
        }
        _this.origindata = getdatabyselectionD(otherfile.data, _this.pivot_select_save);

        let rowhidden = {};
        if (_this.filterparm != null) {
            for (let f in _this.filterparm) {
                // 目的是取出rowhidden
                for (let h in _this.filterparm[f]) {
                    if (h === "rowhidden" && _this.filterparm[f][h] != null) {
                        rowhidden = $.extend(true, rowhidden, _this.filterparm[f][h]);
                    }
                }
            }
        }
        _this.rowhidden = rowhidden;

        _this.pivotSheetIndex = sheetIndex;

        let newdata = [];
        for (let i = 0; i < _this.origindata.length; i++) {
            if (_this.rowhidden != null && _this.rowhidden[i] != null) {
                continue;
            }
            newdata.push([].concat(_this.origindata[i]));
        }
        _this.celldata = newdata;

        _this.pivot_data_type = {};
        for (let c = 0; c < _this.celldata[1].length; c++) {
            let type = isdatatype(_this.celldata[1][c]);
            _this.pivot_data_type[c.toString()] = type;
        }
    },
    pivot_data_type: {},
    pivot_select_save: null,
    column: null,
    row: null,
    values: null,
    filter: null,
    showType: null,
    rowhidden: null,
    selected: null,
    caljs: null,
    initial: true,
    filterparm: null,
    luckysheet_pivotTable_select_state: false,
    jgridCurrentPivotInput: null,
    movestate: false,
    moveitemposition: [],
    movesave: {},
    showvaluecolrow: function() {
        let _this = this;

        if ($("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").length >= 2) {
            $("#luckysheetpivottablevaluecolrowshow").show();

            if (_this.showType == "column") {
                $("#luckysheetpivottablevaluecolrow").prop("checked", true);
                $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").addClass(
                    "ui-state-active",
                );

                $("#luckysheetpivottablevaluecolrow1").prop("checked", false);
                $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']").removeClass(
                    "ui-state-active",
                );
            } else {
                $("#luckysheetpivottablevaluecolrow1").prop("checked", true);
                $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']").addClass(
                    "ui-state-active",
                );

                $("#luckysheetpivottablevaluecolrow").prop("checked", false);
                $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").removeClass(
                    "ui-state-active",
                );
            }
        } else {
            $("#luckysheetpivottablevaluecolrowshow").hide();
        }
    },
    resetOrderby: function(obj) {
        let orderby = $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").index(obj);
        $("#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column")
            .find(".luckysheet-modal-dialog-slider-config-item")
            .each(function() {
                if ($(this).data("orderby") == orderby) {
                    $(this).data("orderby", "self");
                }
            });
    },
    luckysheetsliderlistclearfilter: function($filter) {
        let _this = this;

        let $t = $filter.parent();
        let cindex = $t.data("index");

        let rowhidden = {},
            selected = {},
            d = _this.origindata,
            filterdata = {};

        $t.data("rowhidden", "")
            .find(".luckysheet-slider-list-item-filtered")
            .hide();
        _this.setDatatojsfile("selected", {}, cindex);
        _this.setDatatojsfile("rowhidden", null, cindex);

        let newdata = [];
        for (let i = 0; i < d.length; i++) {
            if (rowhidden[i] != null) {
                continue;
            }
            newdata.push([].concat(d[i]));
        }

        _this.celldata = newdata;
        _this.refreshPivotTable();
        $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide();
    },
    luckysheetsliderlistitemfilter: function($filter) {
        let _this = this;

        const _locale = locale();
        const locale_filter = _locale.filter;

        let $t = $filter.parent(),
            toffset = $t.offset(),
            $menu = $("#luckysheet-pivotTableFilter-menu"),
            winH = $(window).height(),
            winW = $(window).width();

        let cindex = $t.data("index");

        let rowhidden = $t.data("rowhidden");
        if (rowhidden == null || rowhidden == "") {
            rowhidden = {};
        } else if (getObjType(rowhidden) == "string") {
            rowhidden = JSON.parse(rowhidden);
        }

        $("body .luckysheet-cols-menu").hide();
        $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide();
        $("#luckysheet-pivotTableFilter-byvalue-input").val("");
        $("#luckysheet-pivotTableFilter-bycondition")
            .next()
            .hide();
        $("#luckysheet-pivotTableFilter-byvalue")
            .next()
            .show();

        $menu.data("index", cindex);

        $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input")
            .hide()
            .find("input")
            .val();
        $("#luckysheet-pivotTableFilter-selected span")
            .data("type", "0")
            .data("type", null)
            .text(locale_filter.filiterInputNone);

        let byconditiontype = $t.data("byconditiontype");
        $("#luckysheet-pivotTableFilter-selected span")
            .data("value", $t.data("byconditionvalue"))
            .data("type", byconditiontype)
            .text($t.data("byconditiontext"));

        if (byconditiontype == "2") {
            let $input = $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2")
                .show()
                .find("input");
            $input.eq(0).val($t.data("byconditionvalue1"));
            $input.eq(1).val($t.data("byconditionvalue2"));
        } else if (byconditiontype == "1") {
            $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input")
                .eq(0)
                .show()
                .find("input")
                .val($t.data("byconditionvalue1"));
        }
        const loadingObj = luckysheetlodingHTML("#luckysheet-pivotTableFilter-byvalue-select", {
            text: locale_filter.filiterMoreDataTip,
        });
        $("#luckysheet-pivotTableFilter-byvalue-select")
            .empty()
            .append(loadingObj.el);

        let rowhiddenother = {}; //其它筛选列的隐藏行
        $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item")
            .not($t.get(0))
            .each(function() {
                let $t = $(this),
                    rh = $t.data("rowhidden");

                if (rh == null || rh == "") {
                    return true;
                }

                if (getObjType(rh) == "string") {
                    rh = JSON.parse(rh);
                }

                for (let r in rh) {
                    rowhiddenother[r] = 0;
                }
            });

        let data = _this.origindata;

        setTimeout(function() {
            //日期值
            let dvmap = {};
            let dvmap_uncheck = {};

            //除日期以外的值
            let vmap = {};
            let vmap_uncheck = {};

            for (let r = 1; r < data.length; r++) {
                if (r in rowhiddenother) {
                    continue;
                }

                if (data[r] == null) {
                    continue;
                }

                let cell = data[r][cindex];

                if (cell != null && cell.ct != null && cell.ct.t == "d") {
                    //单元格是日期
                    let v = update("YYYY-MM-DD", cell.v);

                    let y = v.split("-")[0];
                    let m = v.split("-")[1];
                    let d = v.split("-")[2];

                    if (!(y in dvmap)) {
                        dvmap[y] = {};
                    }

                    if (!(m in dvmap[y])) {
                        dvmap[y][m] = {};
                    }

                    if (!(d in dvmap[y][m])) {
                        dvmap[y][m][d] = 0;
                    }

                    dvmap[y][m][d]++;

                    if (r in rowhidden) {
                        dvmap_uncheck[y] = 0;
                        dvmap_uncheck[m] = 0;
                        dvmap_uncheck[d] = 0;
                    }
                } else {
                    let v, m;
                    if (cell == null || isRealNull(cell.v)) {
                        v = null;
                        m = null;
                    } else {
                        v = cell.v;
                        m = cell.m;
                    }

                    if (!(v in vmap)) {
                        vmap[v] = {};
                    }

                    if (!(m in vmap[v])) {
                        vmap[v][m] = 0;
                    }

                    vmap[v][m]++;

                    if (r in rowhidden) {
                        vmap_uncheck[v + "#$$$#" + m] = 0;
                    }
                }
            }

            //遍历数据加到页面
            let item = [];

            if (JSON.stringify(dvmap).length > 2) {
                for (let y in dvmap) {
                    let ysum = 0;
                    let monthHtml = "";

                    for (let m in dvmap[y]) {
                        let msum = 0;
                        let dayHtml = "";

                        for (let d in dvmap[y][m]) {
                            let dayL = dvmap[y][m][d];
                            msum += dayL;

                            //月 小于 10
                            let mT;
                            if (Number(m) < 10) {
                                mT = "0" + Number(m);
                            } else {
                                mT = m;
                            }

                            //日 小于 10
                            let dT;
                            if (Number(d) < 10) {
                                dT = "0" + Number(d);
                            } else {
                                dT = d;
                            }

                            //日是否选中状态
                            if (y in dvmap_uncheck && m in dvmap_uncheck && d in dvmap_uncheck) {
                                dayHtml +=
                                    '<div class="day luckysheet-mousedown-cancel cf" data-check="false" title="' +
                                    y +
                                    "-" +
                                    mT +
                                    "-" +
                                    dT +
                                    '">' +
                                    '<input class="luckysheet-mousedown-cancel" type="checkbox"/>' +
                                    '<label class="luckysheet-mousedown-cancel">' +
                                    d +
                                    "</label>" +
                                    '<span class="count luckysheet-mousedown-cancel">( ' +
                                    dayL +
                                    " )</span>" +
                                    "</div>";
                            } else {
                                dayHtml +=
                                    '<div class="day luckysheet-mousedown-cancel cf" data-check="true" title="' +
                                    y +
                                    "-" +
                                    mT +
                                    "-" +
                                    dT +
                                    '">' +
                                    '<input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/>' +
                                    '<label class="luckysheet-mousedown-cancel">' +
                                    d +
                                    "</label>" +
                                    '<span class="count luckysheet-mousedown-cancel">( ' +
                                    dayL +
                                    " )</span>" +
                                    "</div>";
                            }
                        }

                        ysum += msum;

                        //月 小于 10
                        let mT2;
                        if (Number(m) < 10) {
                            mT2 = "0" + Number(m);
                        } else {
                            mT2 = m;
                        }

                        //月是否选中状态
                        if (y in dvmap_uncheck && m in dvmap_uncheck) {
                            monthHtml +=
                                '<div class="monthBox luckysheet-mousedown-cancel">' +
                                '<div class="month luckysheet-mousedown-cancel cf" data-check="false" title="' +
                                y +
                                "-" +
                                mT2 +
                                '">' +
                                '<i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i>' +
                                '<input class="luckysheet-mousedown-cancel" type="checkbox"/>' +
                                '<label class="luckysheet-mousedown-cancel">' +
                                m +
                                "" +
                                locale_filter.filiterMonthText +
                                "</label>" +
                                '<span class="count luckysheet-mousedown-cancel">( ' +
                                msum +
                                " )</span>" +
                                "</div>" +
                                '<div class="dayList luckysheet-mousedown-cancel">' +
                                dayHtml +
                                "</div>" +
                                "</div>";
                        } else {
                            monthHtml +=
                                '<div class="monthBox luckysheet-mousedown-cancel">' +
                                '<div class="month luckysheet-mousedown-cancel cf" data-check="true" title="' +
                                y +
                                "-" +
                                mT2 +
                                '">' +
                                '<i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i>' +
                                '<input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/>' +
                                '<label class="luckysheet-mousedown-cancel">' +
                                m +
                                "" +
                                locale_filter.filiterMonthText +
                                "</label>" +
                                '<span class="count luckysheet-mousedown-cancel">( ' +
                                msum +
                                " )</span>" +
                                "</div>" +
                                '<div class="dayList luckysheet-mousedown-cancel">' +
                                dayHtml +
                                "</div>" +
                                "</div>";
                        }
                    }

                    //年是否选中状态
                    let yearHtml;
                    if (y in dvmap_uncheck) {
                        yearHtml =
                            '<div class="yearBox luckysheet-mousedown-cancel">' +
                            '<div class="year luckysheet-mousedown-cancel cf" data-check="false" title="' +
                            y +
                            '">' +
                            '<i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i>' +
                            '<input class="luckysheet-mousedown-cancel" type="checkbox"/>' +
                            '<label class="luckysheet-mousedown-cancel">' +
                            y +
                            "" +
                            locale_filter.filiterYearText +
                            "</label>" +
                            '<span class="count luckysheet-mousedown-cancel">( ' +
                            ysum +
                            " )</span>" +
                            "</div>" +
                            '<div class="monthList luckysheet-mousedown-cancel">' +
                            monthHtml +
                            "</div>" +
                            "</div>";
                    } else {
                        yearHtml =
                            '<div class="yearBox luckysheet-mousedown-cancel">' +
                            '<div class="year luckysheet-mousedown-cancel cf" data-check="true" title="' +
                            y +
                            '">' +
                            '<i class="fa fa-caret-right luckysheet-mousedown-cancel" aria-hidden="true"></i>' +
                            '<input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/>' +
                            '<label class="luckysheet-mousedown-cancel">' +
                            y +
                            "" +
                            locale_filter.filiterYearText +
                            "</label>" +
                            '<span class="count luckysheet-mousedown-cancel">( ' +
                            ysum +
                            " )</span>" +
                            "</div>" +
                            '<div class="monthList luckysheet-mousedown-cancel">' +
                            monthHtml +
                            "</div>" +
                            "</div>";
                    }

                    item.unshift(yearHtml);
                }
            }

            if (JSON.stringify(vmap).length > 2) {
                let vmapKeys = Object.keys(vmap);
                vmapKeys = orderbydata1D(vmapKeys, true);

                for (let i = 0; i < vmapKeys.length; i++) {
                    let v = vmapKeys[i];

                    for (let x in vmap[v]) {
                        let text;
                        if (v + "#$$$#" + x == "null#$$$#null") {
                            text = locale_filter.valueBlank;
                        } else {
                            text = x;
                        }

                        //是否选中状态
                        let dataHtml;
                        if (v + "#$$$#" + x in vmap_uncheck) {
                            dataHtml =
                                '<div class="textBox luckysheet-mousedown-cancel cf" data-check="false" data-filter="' +
                                (v + "#$$$#" + x) +
                                '" title="' +
                                x +
                                '">' +
                                '<input class="luckysheet-mousedown-cancel" type="checkbox"/>' +
                                '<label class="luckysheet-mousedown-cancel">' +
                                text +
                                "</label>" +
                                '<span class="luckysheet-mousedown-cancel count">( ' +
                                vmap[v][x] +
                                " )</span>" +
                                "</div>";
                        } else {
                            dataHtml =
                                '<div class="textBox luckysheet-mousedown-cancel cf" data-check="true" data-filter="' +
                                (v + "#$$$#" + x) +
                                '" title="' +
                                x +
                                '">' +
                                '<input class="luckysheet-mousedown-cancel" type="checkbox" checked="checked"/>' +
                                '<label class="luckysheet-mousedown-cancel">' +
                                text +
                                "</label>" +
                                '<span class="luckysheet-mousedown-cancel count">( ' +
                                vmap[v][x] +
                                " )</span>" +
                                "</div>";
                        }

                        item.push(dataHtml);
                    }
                }
            }

            // 适配小屏设备
            let containerH = winH - toffset.top - 350;
            if (containerH < 0) containerH = 100;
            //$("#luckysheet-pivotTableFilter-byvalue-select").html("<div class='ListBox luckysheet-mousedown-cancel' style='max-height:" + containerH + "px;overflow-y:auto;overflow-x:hidden;'>" + item.join("") + "</div>");

            $("#luckysheet-pivotTableFilter-byvalue-select").append(
                "<div class='ListBox luckysheet-mousedown-cancel' style='max-height:" +
                    containerH +
                    "px;overflow-y:auto;overflow-x:hidden;'>" +
                    item.join("") +
                    "</div>",
            );
            loadingObj.close();
        }, 1);

        showrightclickmenu($menu, toffset.left - 250, toffset.top);
    },
    getSumTypeName: function(type) {
        let name = "";

        const _locale = locale();
        const locale_pivotTable = _locale.pivotTable;

        if (type == "SUM") {
            name = locale_pivotTable.valueStatisticsSUM;
        } else if (type == "COUNT") {
            name = locale_pivotTable.valueStatisticsCOUNT;
        } else if (type == "COUNTA") {
            name = locale_pivotTable.valueStatisticsCOUNTA;
        } else if (type == "COUNTUNIQUE") {
            name = locale_pivotTable.valueStatisticsCOUNTUNIQUE;
        } else if (type == "AVERAGE") {
            name = locale_pivotTable.valueStatisticsAVERAGE;
        } else if (type == "MAX") {
            name = locale_pivotTable.valueStatisticsMAX;
        } else if (type == "MIN") {
            name = locale_pivotTable.valueStatisticsMIN;
        } else if (type == "MEDIAN") {
            name = locale_pivotTable.valueStatisticsMEDIAN;
        } else if (type == "PRODUCT") {
            name = locale_pivotTable.valueStatisticsPRODUCT;
        } else if (type == "STDEV") {
            name = locale_pivotTable.valueStatisticsSTDEV;
        } else if (type == "STDEVP") {
            name = locale_pivotTable.valueStatisticsSTDEVP;
        } else if (type == "let") {
            name = locale_pivotTable.valueStatisticslet;
        } else if (type == "VARP") {
            name = locale_pivotTable.valueStatisticsVARP;
        }

        return name;
    },
    setDatatojsfile: function(attr, value, cindex) {
        let _this = this;

        let index = getSheetIndex(_this.pivotSheetIndex);
        if (Store.luckysheetfile[index]["pivotTable"] == null) {
            Store.luckysheetfile[index]["pivotTable"] = {};
        }

        if (cindex == null) {
            Store.luckysheetfile[index]["pivotTable"][attr] = value;
            _this[attr] = value;
        } else {
            if (Store.luckysheetfile[index]["pivotTable"]["filterparm"] == null) {
                Store.luckysheetfile[index]["pivotTable"]["filterparm"] = {};
            }

            if (Store.luckysheetfile[index]["pivotTable"]["filterparm"][cindex.toString()] == null) {
                Store.luckysheetfile[index]["pivotTable"]["filterparm"][cindex.toString()] = {};
            }
            Store.luckysheetfile[index]["pivotTable"]["filterparm"][cindex.toString()][attr] = value;

            if (_this["filterparm"] == null) {
                _this["filterparm"] = {};
            }

            if (_this["filterparm"][cindex.toString()] == null) {
                _this["filterparm"][cindex.toString()] = {};
            }

            _this["filterparm"][cindex.toString()][attr] = value;
        }
    },
    createPivotTable: function(e) {
        if (isEditMode() || Store.allowEdit === false) {
            return;
        }
        let _this = this;

        let datasheetindex = Store.currentSheetIndex;

        const _locale = locale();
        const locale_pivotTable = _locale.pivotTable;

        if (isEditMode()) {
            alert(locale_pivotTable.errorNotAllowEdit);
            return;
        }

        if (Store.luckysheet_select_save.length > 1) {
            tooltip.info("", locale_pivotTable.errorNotAllowMulti);
            return;
        }

        if (
            Store.luckysheet_select_save.length == 0 ||
            Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] ||
            Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]
        ) {
            tooltip.info("", locale_pivotTable.errorSelectRange);
            return;
        }

        let select_save = $.extend(true, {}, Store.luckysheet_select_save[0]);
        sheetmanage.addNewSheet(e, true);

        _this.getCellData(Store.currentSheetIndex, datasheetindex, select_save);

        _this.setDatatojsfile("pivot_select_save", select_save);
        _this.setDatatojsfile("pivotDataSheetIndex", datasheetindex);

        _this.initialPivotManage();
    },
    changePivotTable: function(index) {
        let _this = this;

        const _locale = locale();
        const locale_pivotTable = _locale.pivotTable;

        let pivotDataSheetIndex = Store.luckysheetfile[getSheetIndex(index)].pivotTable.pivotDataSheetIndex;
        let real_pivotDataSheetIndex = getSheetIndex(pivotDataSheetIndex);

        if (real_pivotDataSheetIndex == null) {
            tooltip.info(locale_pivotTable.errorIsDamage, "");
            return;
        }

        _this.getCellData(index);
        _this.initialPivotManage(true);
        _this.refreshPivotTable(); //初始化在一个普通sheet页，从此普通sheet页切换到数据透视表页时，需要刷新下数据，否则还是旧数据
    },
    refreshPivotTable: function(isRefreshCanvas = true) {
        let _this = this;

        let redo = {};
        redo["pivotTable"] = pivotTable;
        redo["data"] = editor.deepCopyFlowData(Store.flowdata); //取数据

        _this.storePivotTableParam();
        let ret = _this.dataHandler(_this.column, _this.row, _this.values, _this.showType, _this.celldata);
        _this.setDatatojsfile("pivotDatas", ret);

        let d = $.extend(true, [], sheetmanage.nulldata);
        let data = d;

        let addr = 0,
            addc = 0;

        if (ret.length == 0) {
            _this.setDatatojsfile("drawPivotTable", true);
            _this.setDatatojsfile("pivotTableBoundary", [12, 6]);
        } else {
            _this.setDatatojsfile("drawPivotTable", false);
            _this.setDatatojsfile("pivotTableBoundary", [ret.length, ret[0].length]);

            let rlen = ret.length,
                clen = ret[0].length;

            addr = rlen - d.length;
            addc = clen - d[0].length;

            data = datagridgrowth(d, addr + 20, addc + 10, true);

            for (let r = 0; r < rlen; r++) {
                let x = [].concat(data[r]);
                for (let c = 0; c < clen; c++) {
                    let value = "";
                    if (ret[r] != null && ret[r][c] != null) {
                        value = getcellvalue(r, c, ret);
                    }
                    x[c] = value;
                }
                data[r] = x;
            }
        }

        redo["type"] = "pivotTable_change";
        redo["curdata"] = $.extend(true, [], data);
        redo["sheetIndex"] = Store.currentSheetIndex;
        redo["pivotTablecur"] = _this.getPivotTableData();

        if (Store.clearjfundo) {
            Store.jfundo.length = 0;
            Store.jfredo.push(redo);
        }

        cleargridelement();
        Store.clearjfundo = false;

        if (addr > 0 || addc > 0) {
            jfrefreshgridall(
                data[0].length,
                data.length,
                data,
                null,
                Store.luckysheet_select_save,
                "datachangeAll",
                undefined,
                undefined,
                isRefreshCanvas,
            );
        } else {
            jfrefreshgrid(data, Store.luckysheet_select_save, {}, null, isRefreshCanvas);
            selectHightlightShow();
        }

        Store.clearjfundo = true;
    },
    drawPivotTable: true,
    pivotTableBoundary: [12, 6],
    pivotclick: function(row_index, col_index, index) {
        if (index == null) {
            index = Store.currentSheetIndex;
        }

        let file = Store.luckysheetfile[getSheetIndex(index)];

        if (!file.isPivotTable) {
            return;
        }

        let pivotDataSheetIndex = file.pivotTable.pivotDataSheetIndex;
        let real_pivotDataSheetIndex = getSheetIndex(pivotDataSheetIndex);

        if (real_pivotDataSheetIndex == null) {
            return;
        }

        let slider = $("#luckysheet-modal-dialog-slider-pivot");

        let isRangeClick = this.isPivotRange(row_index, col_index);
        if (isRangeClick && slider.is(":hidden")) {
            if (!checkProtectionAuthorityNormal(index, "usePivotTablereports", false)) {
                // Store.luckysheet_select_status = false;
                return;
            }
            slider.show();
            luckysheetsizeauto();
            $("#luckysheet-sta-content").css("padding-right", 260);
        } else if (!isRangeClick && slider.is(":visible")) {
            slider.hide();
            luckysheetsizeauto();
            $("#luckysheet-sta-content").css("padding-right", 10);
        }
    },
    isPivotRange: function(row_index, col_index) {
        let _this = this;

        if (!!Store.luckysheetcurrentisPivotTable) {
            if (row_index < _this.pivotTableBoundary[0] && col_index < _this.pivotTableBoundary[1]) {
                return true;
            } else {
                return false;
            }
        }
    },
    storePivotTableParam: function() {
        let _this = this;
        let columnarr = [],
            rowarr = [],
            filterarr = [],
            valuesarr = [];

        $("#luckysheet-modal-dialog-config-filter .luckysheet-modal-dialog-slider-config-item").each(function() {
            let item = {};
            item["index"] = $(this).data("index");
            item["name"] = $(this).data("name");
            item["fullname"] = $(this)
                .find(".luckysheet-modal-dialog-slider-config-item-txt")
                .text();
            filterarr.push(item);
        });

        $("#luckysheet-modal-dialog-config-row .luckysheet-modal-dialog-slider-config-item").each(function() {
            let item = {};
            item["index"] = $(this).data("index");
            item["name"] = $(this).data("name");
            item["fullname"] = $(this)
                .find(".luckysheet-modal-dialog-slider-config-item-txt")
                .text();
            item["order"] = $(this).data("order");
            item["orderby"] = $(this).data("orderby");
            item["stastic"] = $(this).data("stastic");
            rowarr.push(item);
        });

        $("#luckysheet-modal-dialog-config-column .luckysheet-modal-dialog-slider-config-item").each(function() {
            let item = {};
            item["index"] = $(this).data("index");
            item["name"] = $(this).data("name");
            item["fullname"] = $(this)
                .find(".luckysheet-modal-dialog-slider-config-item-txt")
                .text();
            item["order"] = $(this).data("order");
            item["orderby"] = $(this).data("orderby");
            item["stastic"] = $(this).data("stastic");
            columnarr.push(item);
        });

        $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").each(function() {
            let item = {};
            item["index"] = $(this).data("index");
            item["name"] = $(this).data("name");
            item["fullname"] = $(this)
                .find(".luckysheet-modal-dialog-slider-config-item-txt")
                .text();
            item["sumtype"] = $(this).data("sumtype");
            item["nameindex"] = $(this).data("nameindex");
            valuesarr.push(item);
        });

        _this.setDatatojsfile("column", columnarr);
        _this.setDatatojsfile("row", rowarr);
        _this.setDatatojsfile("filter", filterarr);
        _this.setDatatojsfile("values", valuesarr);
        let showtype = $("#luckysheetpivottablevaluecolrow:checked, #luckysheetpivottablevaluecolrow1:checked").val();
        _this.setDatatojsfile("showType", showtype == "0" ? "row" : "column");

        let pivotTable = _this.getPivotTableData();
        delete pivotTable.pivotDatas;
        server.saveParam("all", _this.pivotSheetIndex, pivotTable, { k: "pivotTable" });
    },
    getPivotTableData: function(dataindex) {
        if (dataindex == null) {
            dataindex = this.pivotSheetIndex;
        }

        let index = getSheetIndex(dataindex);
        let pivotTable = Store.luckysheetfile[index]["pivotTable"];

        if (getObjType(pivotTable) == "object") {
            pivotTable = $.extend(true, {}, Store.luckysheetfile[index]["pivotTable"]);
        } else {
            pivotTable = new Function("return " + pivotTable)();
        }

        return pivotTable;
    },
    addValuesToTitle: function(titles, values) {
        let rowLen = titles.length * values.length,
            colLen = titles[0].length + 1;

        let retdata = [];
        if (titles.length == 0 && values.length > 0) {
            for (let v = 0; v < values.length; v++) {
                retdata.push(values[v].fullname);
            }

            return retdata;
        }

        if (values.length == 0 && titles.length > 0) {
            return titles;
        }

        for (let r = 0; r < rowLen; r++) {
            retdata[r] = new Array(colLen);

            for (let c = 0; c < colLen - 1; c++) {
                retdata[r][c] = titles[Math.floor(r / values.length)][c];
            }

            retdata[r][colLen - 1] = values[r % values.length].fullname;
        }

        return retdata;
    },
    initialPivotManage: function(restore) {
        let _this = this;
        const _locale = locale();
        const locale_pivotTable = _locale.pivotTable;
        const locale_button = _locale.button;
        const locale_filter = _locale.filter;

        if (_this.initial) {
            _this.initial = false;

            $("body").append(luckysheetPivotTableHTML());
            $("#luckysheet-modal-dialog-slider-close").click(function() {
                $("#luckysheet-modal-dialog-slider-pivot").hide();
                luckysheetsizeauto();
            });

            $("body").append(
                replaceHtml(modelHTML, {
                    id: "luckysheet-data-pivotTable-selection",
                    addclass: "luckysheet-data-pivotTable-selection",
                    title: locale_pivotTable.titleSelectionDataRange,
                    content:
                        '<input id="luckysheet-pivotTable-range-selection-input" class="luckysheet-datavisual-range-container" style="font-size: 14px;padding:5px;max-width:none;" spellcheck="false" aria-label="' +
                        locale_pivotTable.titleDataRange +
                        '" placeholder="' +
                        locale_pivotTable.titleDataRange +
                        '">',
                    botton:
                        '<button id="luckysheet-pivotTable-selection-confirm" class="btn btn-primary">' +
                        locale_button.confirm +
                        '</button><button class="btn btn-default luckysheet-model-close-btn">' +
                        locale_button.cancel +
                        "</button>",
                }),
            );

            $("body").append(replaceHtml(filtermenuHTML(), { menuid: "pivotTableFilter" }));
            $("body").append(replaceHtml(filtersubmenuHTML(), { menuid: "pivotTableFilter" }));
            $("body").append(pivottableconfigHTML());
            $("body").append(pivottablesumHTML());

            $("#luckysheet-pivotTableFilter-orderby-asc").remove();
            $("#luckysheet-pivotTableFilter-orderby-desc")
                .next()
                .remove();
            $("#luckysheet-pivotTableFilter-orderby-desc").remove();
            $("#luckysheet-pivotTableFilter-orderby-color")
                .next()
                .remove();
            $("#luckysheet-pivotTableFilter-orderby-color").remove();

            $("#luckysheetpivottablevaluecolrow, #luckysheetpivottablevaluecolrow1")
                .checkboxradio({
                    icon: false,
                })
                .change(function() {
                    _this.refreshPivotTable();
                });

            let hidefilersubmenu = null;
            $("#luckysheet-pivotTableFilter-menu").mouseover(function() {
                clearTimeout(hidefilersubmenu);
                hidefilersubmenu = setTimeout(function() {
                    $("#luckysheet-pivotTableFilter-submenu").hide();
                }, 500);
            });

            //点击复选框
            $(document)
                .off("click.ptFilterCheckbox1")
                .on("click.ptFilterCheckbox1", "#luckysheet-pivotTableFilter-byvalue-select .textBox", function() {
                    if ($(this).attr("data-check") == "true") {
                        $(this).attr("data-check", "false");
                        $(this)
                            .find("input[type='checkbox']")
                            .removeAttr("checked");
                    } else {
                        $(this).attr("data-check", "true");
                        $(this)
                            .find("input[type='checkbox']")
                            .prop("checked", true);
                    }
                });
            $(document)
                .off("click.ptFilterCheckbox2")
                .on("click.ptFilterCheckbox2", "#luckysheet-pivotTableFilter-byvalue-select .year", function() {
                    if ($(this).attr("data-check") == "true") {
                        $(this).attr("data-check", "false");
                        $(this)
                            .parents(".yearBox")
                            .find(".month")
                            .attr("data-check", "false");
                        $(this)
                            .parents(".yearBox")
                            .find(".day")
                            .attr("data-check", "false");
                        $(this)
                            .parents(".yearBox")
                            .find("input[type='checkbox']")
                            .removeAttr("checked");
                    } else {
                        $(this).attr("data-check", "true");
                        $(this)
                            .parents(".yearBox")
                            .find(".month")
                            .attr("data-check", "true");
                        $(this)
                            .parents(".yearBox")
                            .find(".day")
                            .attr("data-check", "true");
                        $(this)
                            .parents(".yearBox")
                            .find("input[type='checkbox']")
                            .prop("checked", true);
                    }
                });
            $(document)
                .off("click.ptFilterCheckbox3")
                .on("click.ptFilterCheckbox3", "#luckysheet-pivotTableFilter-byvalue-select .month", function() {
                    //月份 对应的 天
                    if ($(this).attr("data-check") == "true") {
                        $(this).attr("data-check", "false");
                        $(this)
                            .parents(".monthBox")
                            .find(".day")
                            .attr("data-check", "false");
                        $(this)
                            .parents(".monthBox")
                            .find("input[type='checkbox']")
                            .removeAttr("checked");
                    } else {
                        $(this).attr("data-check", "true");
                        $(this)
                            .parents(".monthBox")
                            .find(".day")
                            .attr("data-check", "true");
                        $(this)
                            .parents(".monthBox")
                            .find("input[type='checkbox']")
                            .prop("checked", true);
                    }
                    //月份 对应的 年份
                    let yearDayAllCheck = true;
                    let $yearDay = $(this)
                        .parents(".yearBox")
                        .find(".day");
                    $yearDay.each(function(i, e) {
                        if ($(e).attr("data-check") == "true") {
                        } else {
                            yearDayAllCheck = false;
                        }
                    });
                    if (yearDayAllCheck) {
                        $(this)
                            .parents(".yearBox")
                            .find(".year")
                            .attr("data-check", "true");
                        $(this)
                            .parents(".yearBox")
                            .find(".year input[type='checkbox']")
                            .prop("checked", true);
                    } else {
                        $(this)
                            .parents(".yearBox")
                            .find(".year")
                            .attr("data-check", "false");
                        $(this)
                            .parents(".yearBox")
                            .find(".year input[type='checkbox']")
                            .removeAttr("checked");
                    }
                });
            $(document)
                .off("click.ptFilterCheckbox4")
                .on("click.ptFilterCheckbox4", "#luckysheet-pivotTableFilter-byvalue-select .day", function() {
                    if ($(this).attr("data-check") == "true") {
                        $(this).attr("data-check", "false");
                        $(this)
                            .find("input[type='checkbox']")
                            .removeAttr("checked");
                    } else {
                        $(this).attr("data-check", "true");
                        $(this)
                            .find("input[type='checkbox']")
                            .prop("checked", true);
                    }
                    //天 对应的 月份
                    let monthDayAllCheck = true;
                    let $monthDay = $(this)
                        .parents(".monthBox")
                        .find(".day");
                    $monthDay.each(function(i, e) {
                        if ($(e).attr("data-check") == "true") {
                        } else {
                            monthDayAllCheck = false;
                        }
                    });
                    if (monthDayAllCheck) {
                        $(this)
                            .parents(".monthBox")
                            .find(".month")
                            .attr("data-check", "true");
                        $(this)
                            .parents(".monthBox")
                            .find(".month input[type='checkbox']")
                            .prop("checked", true);
                    } else {
                        $(this)
                            .parents(".monthBox")
                            .find(".month")
                            .attr("data-check", "false");
                        $(this)
                            .parents(".monthBox")
                            .find(".month input[type='checkbox']")
                            .removeAttr("checked");
                    }
                    //天 对应的 年份
                    let yearDayAllCheck = true;
                    let $yearDay = $(this)
                        .parents(".yearBox")
                        .find(".day");
                    $yearDay.each(function(i, e) {
                        if ($(e).attr("data-check") == "true") {
                        } else {
                            yearDayAllCheck = false;
                        }
                    });
                    if (yearDayAllCheck) {
                        $(this)
                            .parents(".yearBox")
                            .find(".year")
                            .attr("data-check", "true");
                        $(this)
                            .parents(".yearBox")
                            .find(".year input[type='checkbox']")
                            .prop("checked", true);
                    } else {
                        $(this)
                            .parents(".yearBox")
                            .find(".year")
                            .attr("data-check", "false");
                        $(this)
                            .parents(".yearBox")
                            .find(".year input[type='checkbox']")
                            .removeAttr("checked");
                    }
                });

            //日期 三级下拉显示
            $(document)
                .off("click.ptFilterYearDropdown")
                .on(
                    "click.ptFilterYearDropdown",
                    "#luckysheet-pivotTableFilter-byvalue-select .yearBox .fa-caret-right",
                    function() {
                        let $p = $(this).parents(".luckysheet-mousedown-cancel");
                        if ($p.hasClass("year")) {
                            $(this)
                                .parents(".yearBox")
                                .find(".monthList")
                                .slideToggle();
                        }
                        if ($p.hasClass("month")) {
                            $(this)
                                .parents(".monthBox")
                                .find(".dayList")
                                .slideToggle();
                        }
                    },
                );

            //全选
            $("#luckysheet-pivotTableFilter-byvalue-btn-all").click(function() {
                $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").prop("checked", true);
                $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']")
                    .parents(".luckysheet-mousedown-cancel")
                    .attr("data-check", "true");
            });

            //反选
            $("#luckysheet-pivotTableFilter-byvalue-btn-contra").click(function() {
                let $input = $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']");
                $input.each(function(i, e) {
                    if ($(e).is(":checked")) {
                        $(e).removeAttr("checked");
                        $(e)
                            .parents(".luckysheet-mousedown-cancel")
                            .attr("data-check", "false");
                    } else {
                        $(e).prop("checked", true);
                        $(e)
                            .parents(".luckysheet-mousedown-cancel")
                            .attr("data-check", "true");
                    }
                });
                //天 对应的 月份
                let $month = $("#luckysheet-pivotTableFilter-byvalue-select .ListBox .monthBox");
                $month.each(function(index, event) {
                    let monthDayAllCheck = true;
                    let $monthDay = $(event).find(".day input[type='checkbox']");
                    $monthDay.each(function(i, e) {
                        if ($(e).is(":checked")) {
                        } else {
                            monthDayAllCheck = false;
                        }
                    });
                    if (monthDayAllCheck) {
                        $(event)
                            .find(".month input[type='checkbox']")
                            .prop("checked", true);
                        $(event).attr("data-check", "true");
                    } else {
                        $(event)
                            .find(".month input[type='checkbox']")
                            .removeAttr("checked");
                        $(event).attr("data-check", "false");
                    }
                });
                //天 对应的 年份
                let $year = $("#luckysheet-pivotTableFilter-byvalue-select .ListBox .yearBox");
                $year.each(function(index, event) {
                    let yearDayAllCheck = true;
                    let $yearDay = $(event).find(".day input[type='checkbox']");
                    $yearDay.each(function(i, e) {
                        if ($(e).is(":checked")) {
                        } else {
                            yearDayAllCheck = false;
                        }
                    });
                    if (yearDayAllCheck) {
                        $(event)
                            .find(".year input[type='checkbox']")
                            .prop("checked", true);
                        $(event).attr("data-check", "true");
                    } else {
                        $(event)
                            .find(".year input[type='checkbox']")
                            .removeAttr("checked");
                        $(event).attr("data-check", "false");
                    }
                });
            });

            //清除
            $("#luckysheet-pivotTableFilter-byvalue-btn-clear").click(function() {
                $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").removeAttr("checked");
                $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']")
                    .parents(".luckysheet-mousedown-cancel")
                    .attr("data-check", "false");
            });

            //按照值进行筛选
            $("#luckysheet-pivotTableFilter-byvalue-input").on("input propertychange", function() {
                let v = $(this)
                    .val()
                    .toString();
                $("#luckysheet-pivotTableFilter-byvalue-select .ListBox .luckysheet-mousedown-cancel").show();
                if (v != "") {
                    let $check = $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']");
                    $check.each(function(i, e) {
                        let $p = $(e).parents(".luckysheet-mousedown-cancel");
                        if ($p.hasClass("day")) {
                            //日期
                            let day = $(e)
                                .siblings("label")
                                .text()
                                .toString();
                            let month = $(e)
                                .parents(".monthBox")
                                .find(".month label")
                                .text()
                                .toString();
                            let year = $(e)
                                .parents(".yearBox")
                                .find(".year label")
                                .text()
                                .toString();
                            let itemV = year + "-" + month + "-" + day;

                            if (itemV.indexOf(v) == -1) {
                                $(e)
                                    .parents(".day")
                                    .hide();
                                //天 对应的 月份
                                let $monthDay = $(e)
                                    .parents(".dayList")
                                    .find(".day:visible");
                                if ($monthDay.length == 0) {
                                    $(e)
                                        .parents(".monthBox")
                                        .find(".month")
                                        .hide();
                                }
                                //天 对应的 年份
                                let $yearDay = $(e)
                                    .parents(".monthList")
                                    .find(".day:visible");
                                if ($yearDay.length == 0) {
                                    $(e)
                                        .parents(".yearBox")
                                        .find(".year")
                                        .hide();
                                }
                            }
                        }
                        if ($p.hasClass("textBox")) {
                            //其它
                            let itemV = $(e)
                                .siblings("label")
                                .text()
                                .toString();

                            if (itemV.indexOf(v) == -1) {
                                $(e)
                                    .parents(".textBox")
                                    .hide();
                            }
                        }
                    });
                }
            });

            $("#luckysheet-pivotTableFilter-bycondition, #luckysheet-pivotTableFilter-byvalue").click(function() {
                let $t = $(this);
                $t.next().slideToggle(200);
                setTimeout(function() {
                    if (
                        $t.attr("id") == "luckysheet-pivotTableFilter-bycondition" &&
                        $("#luckysheet-pivotTableFilter-bycondition")
                            .next()
                            .is(":visible")
                    ) {
                        if ($("#luckysheet-pivotTableFilter-selected span").text() != locale_filter.filiterInputNone) {
                            $("#luckysheet-pivotTableFilter-byvalue")
                                .next()
                                .slideUp(200);
                        }
                    }

                    if ($t.is($("#luckysheet-pivotTableFilter-bycondition"))) {
                        if (
                            $("#luckysheet-pivotTableFilter-bycondition")
                                .next()
                                .is(":hidden") &&
                            $("#luckysheet-pivotTableFilter-byvalue")
                                .next()
                                .is(":hidden")
                        ) {
                            $("#luckysheet-pivotTableFilter-byvalue")
                                .next()
                                .slideDown(200);
                        }
                    }
                }, 300);
            });

            //取消按钮
            $("#luckysheet-pivotTableFilter-cancel").click(function() {
                $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide();
            });

            $("#luckysheet-pivotTableFilter-selected").click(function() {
                let $t = $(this),
                    toffset = $t.offset(),
                    $menu = $("#luckysheet-pivotTableFilter-submenu");
                $menu.hide();
                let winH = $(window).height(),
                    winW = $(window).width();
                let menuW = $menu.width(),
                    menuH = $menu.height();
                let top = toffset.top,
                    left = toffset.left,
                    mheight = winH - toffset.top - 20;
                if (toffset.left + menuW > winW) {
                    left = toffset.left - menuW;
                }

                if (toffset.top > winH / 2) {
                    top = winH - toffset.top;
                    if (top < 0) {
                        top = 0;
                    }

                    mheight = toffset.top - 20;
                }

                $menu.css({ top: top, left: left, height: mheight }).show();
                clearTimeout(hidefilersubmenu);
            });

            //按条件过滤
            $("#luckysheet-pivotTableFilter-submenu")
                .mouseover(function() {
                    clearTimeout(hidefilersubmenu);
                })
                .find(".luckysheet-cols-menuitem")
                .click(function(e) {
                    $("#luckysheet-pivotTableFilter-selected span")
                        .html(
                            $(this)
                                .find(".luckysheet-cols-menuitem-content")
                                .text(),
                        )
                        .data("value", $(this).data("value"));
                    $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input").hide();
                    if ($(this).data("type") == "2") {
                        $("#luckysheet-pivotTableFilter-selected span").data("type", "2");
                        $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2").show();
                    } else if ($(this).data("type") == "0") {
                        $("#luckysheet-pivotTableFilter-selected span").data("type", "0");
                    } else {
                        $("#luckysheet-pivotTableFilter-selected span").data("type", "1");
                        $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input")
                            .eq(0)
                            .show();
                        //若是日期 改变input type类型为date
                        if (
                            $(this).attr("data-value") == "dateequal" ||
                            $(this).attr("data-value") == "datelessthan" ||
                            $(this).attr("data-value") == "datemorethan"
                        ) {
                            $(
                                "#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input",
                            ).prop("type", "date");
                        } else {
                            $(
                                "#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input",
                            ).prop("type", "text");
                        }
                    }
                    $("#luckysheet-pivotTableFilter-byvalue")
                        .next()
                        .slideUp();
                    $("#luckysheet-pivotTableFilter-submenu").hide();
                });

            $("#luckysheet-modal-dialog-pivotTable-list").on("click", " .luckysheet-slider-list-item-filter", function(
                e,
            ) {
                _this.luckysheetsliderlistitemfilter($(this));
                e.stopPropagation();
                return false;
            });

            $("#luckysheet-modal-dialog-pivotTable-list").on(
                "click",
                " .luckysheet-slider-list-item-filtered",
                function(e) {
                    _this.luckysheetsliderlistclearfilter($(this).next());
                    e.stopPropagation();
                    return false;
                },
            );

            $("#luckysheet-dialog-pivotTable-range-seleted").click(function() {
                $("#luckysheet-modal-dialog-slider-pivot").hide();
                luckysheetsizeauto();
                let $t = $("#luckysheet-data-pivotTable-selection"),
                    myh = $t.outerHeight(),
                    myw = $t.outerWidth();
                let winw = $(window).width(),
                    winh = $(window).height();
                let scrollLeft = $(document).scrollLeft(),
                    scrollTop = $(document).scrollTop();

                $("#luckysheet-data-pivotTable-selection")
                    .css({ left: (winw + scrollLeft - myw) / 2, top: (winh + scrollTop - myh) / 4 })
                    .show();

                _this.jgridCurrentPivotInput = $("#luckysheet-dialog-pivotTable-range").html();
                $("#luckysheet-pivotTable-range-selection-input").val(_this.jgridCurrentPivotInput);
                _this.luckysheet_pivotTable_select_state = true;
            });

            //清除筛选按钮
            $("#luckysheet-pivotTableFilter-initial").click(function() {
                $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-slider-list-item-filtered").hide();
                $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").data(
                    "rowhidden",
                    "",
                );
                $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide();
                $("#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input")
                    .hide()
                    .find("input")
                    .val();
                $("#luckysheet-pivotTableFilter-selected span")
                    .data("type", "0")
                    .data("type", null)
                    .text(locale_filter.filiterInputNone);

                _this.setDatatojsfile("filterparm", null);
                _this.celldata = _this.origindata;

                _this.refreshPivotTable();
            });

            $("#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column").on(
                "click",
                ".luckysheet-modal-dialog-slider-config-item-icon",
                function(e) {
                    let $t = $(e.target),
                        $item = $t.closest(".luckysheet-modal-dialog-slider-config-item"),
                        cindex = $item.data("index"),
                        toffset = $item.offset();
                    let order = $item.data("order"),
                        orderby = $item.data("orderby"),
                        stastic = $item.data("stastic");

                    if (order == null) {
                        order = "default";
                    }

                    let option =
                        '<option value="self">' +
                        $item.find(".luckysheet-modal-dialog-slider-config-item-txt").data("name") +
                        "</option>";

                    $("#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item").each(
                        function(i) {
                            option +=
                                '<option value="' +
                                i +
                                '">' +
                                $(this)
                                    .find(".luckysheet-modal-dialog-slider-config-item-txt")
                                    .text() +
                                "</option>";
                        },
                    );
                    $("#luckysheet-pivotTable-config-option-orderby")
                        .empty()
                        .html(option);

                    if (orderby == null) {
                        orderby = "self";
                    }

                    if (stastic == null) {
                        stastic = "1";
                    }

                    $("#luckysheet-pivotTable-config-option-order")
                        .val(order)
                        .data("index", cindex);
                    $("#luckysheet-pivotTable-config-option-orderby")
                        .val(orderby)
                        .data("index", cindex);
                    $("#luckysheet-pivotTable-config-option-stastic")
                        .val(stastic)
                        .data("index", cindex);

                    mouseclickposition(
                        $("#luckysheet-pivotTable-config-option"),
                        toffset.left + $item.outerWidth(),
                        toffset.top - 13,
                        "rightbottom",
                    );
                    e.stopPropagation();
                    return false;
                },
            );

            $(
                "#luckysheet-pivotTable-config-option-order,#luckysheet-pivotTable-config-option-orderby,#luckysheet-pivotTable-config-option-stastic",
            ).change(function() {
                let $t = $(this),
                    cindex = $t.data("index");

                $("#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column")
                    .find(".luckysheet-modal-dialog-slider-config-item")
                    .each(function() {
                        if ($(this).data("index") == cindex) {
                            $(this).data($t.attr("id").replace("luckysheet-pivotTable-config-option-", ""), $t.val());
                        }
                    });

                _this.refreshPivotTable();
            });

            $("#luckysheet-modal-dialog-config-value").on(
                "click",
                ".luckysheet-modal-dialog-slider-config-item-icon",
                function(e) {
                    let $t = $(e.target),
                        $item = $t.closest(".luckysheet-modal-dialog-slider-config-item"),
                        cindex = $item.data("index"),
                        toffset = $item.offset(),
                        sumtype = $item.data("sumtype");

                    let type = _this.pivot_data_type[cindex.toString()];
                    if (sumtype == null) {
                        if (type == "num") {
                            sumtype = "SUM";
                        } else {
                            sumtype = "COUNTA";
                        }
                    }

                    let $menu = $("#luckysheet-pivotTable-config-option-sumtype");
                    $menu.find(".luckysheet-submenu-arrow").hide();
                    $menu
                        .find(".luckysheet-cols-menuitem[sumtype='" + sumtype + "'] .luckysheet-submenu-arrow")
                        .css("display", "inline");
                    $menu.data("item", $item);

                    mouseclickposition($menu, toffset.left + $item.outerWidth(), toffset.top - 13, "rightbottom");
                    e.stopPropagation();
                    return false;
                },
            );

            $("#luckysheet-pivotTable-config-option-sumtype .luckysheet-cols-menuitem").click(function() {
                let $item = $("#luckysheet-pivotTable-config-option-sumtype").data("item");
                let sumtype = $(this).attr("sumtype");
                $item.data("sumtype", $(this).attr("sumtype"));
                let name = _this.getSumTypeName(sumtype) + ":" + $item.data("name");
                $item
                    .attr("title", name)
                    .find(".luckysheet-modal-dialog-slider-config-item-txt")
                    .html(name);
                $("#luckysheet-pivotTable-config-option-sumtype").hide();
                _this.refreshPivotTable();
            });

            $("#luckysheet-modal-dialog-config-filter").on(
                "click",
                ".luckysheet-modal-dialog-slider-config-item-icon",
                function(e) {
                    let $t = $(e.target),
                        cindex = $t.closest(".luckysheet-modal-dialog-slider-config-item").data("index");
                    _this.luckysheetsliderlistitemfilter(
                        $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item")
                            .eq(cindex)
                            .find(".luckysheet-slider-list-item-filter"),
                    );
                    e.stopPropagation();
                    return false;
                },
            );

            //确认按钮
            $("#luckysheet-pivotTableFilter-confirm").click(function() {
                let $menu = $("#luckysheet-pivotTableFilter-menu");
                let cindex = $menu.data("index");

                let rowhiddenother = {}; //其它筛选列的隐藏行
                $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").each(
                    function() {
                        let $t = $(this),
                            rh = $t.data("rowhidden");

                        if ($t.data("index") != cindex) {
                            if (rh == null || rh == "") {
                                return true;
                            }

                            if (getObjType(rh) == "string") {
                                rh = JSON.parse(rh);
                            }

                            for (let r in rh) {
                                rowhiddenother[r] = 0;
                            }
                        }
                    },
                );

                let d = _this.origindata;

                let filterdata = {};
                let rowhidden = {};
                let caljs = {};

                if (
                    $("#luckysheet-pivotTableFilter-bycondition")
                        .next()
                        .is(":visible") &&
                    $("#luckysheet-pivotTableFilter-byvalue")
                        .next()
                        .is(":hidden") &&
                    $("#luckysheet-pivotTableFilter-selected span").data("value") != "null"
                ) {
                    let $t = $("#luckysheet-pivotTableFilter-selected span");
                    let type = $t.data("type"),
                        value = $t.data("value");

                    caljs["value"] = value;
                    caljs["text"] = $t.text();

                    if (type == "0") {
                        caljs["type"] = "0";
                    } else if (type == "2") {
                        let $input = $(
                            "#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2 input",
                        );
                        caljs["type"] = "2";
                        caljs["value1"] = $input.eq(0).val();
                        caljs["value2"] = $input.eq(1).val();
                    } else {
                        caljs["type"] = "1";
                        caljs["value1"] = $(
                            "#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input",
                        )
                            .eq(0)
                            .find("input")
                            .val();
                    }

                    for (let r = 1; r < d.length; r++) {
                        if (r in rowhiddenother) {
                            continue;
                        }

                        if (d[r] == null) {
                            continue;
                        }

                        let cell = d[r][cindex];

                        if (value == "cellnull") {
                            //单元格为空
                            if (cell != null && !isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "cellnonull") {
                            //单元格有数据
                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "textinclude") {
                            //文本包含
                            let value1 = caljs["value1"];

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else {
                                if (cell.m.indexOf(value1) == -1) {
                                    rowhidden[r] = 0;
                                }
                            }
                        } else if (value == "textnotinclude") {
                            //文本不包含
                            let value1 = caljs["value1"];

                            if (cell == null || isRealNull(cell.v)) {
                            } else {
                                if (cell.m.indexOf(value1) > -1) {
                                    rowhidden[r] = 0;
                                }
                            }
                        } else if (value == "textstart") {
                            //文本开头为
                            let value1 = caljs["value1"],
                                valuelen = value1.length;

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else {
                                if (cell.m.substr(0, valuelen) != value1) {
                                    rowhidden[r] = 0;
                                }
                            }
                        } else if (value == "textend") {
                            //文本结尾为
                            let value1 = caljs["value1"],
                                valuelen = value1.length;

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else {
                                if (
                                    valuelen > cell.m.length ||
                                    cell.m.substr(cell.m.length - valuelen, valuelen) != value1
                                ) {
                                    rowhidden[r] = 0;
                                }
                            }
                        } else if (value == "textequal") {
                            //文本等于
                            let value1 = caljs["value1"];

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else {
                                if (cell.m != value1) {
                                    rowhidden[r] = 0;
                                }
                            }
                        } else if (value == "dateequal") {
                            //日期等于
                            let value1 = genarate(caljs["value1"])[2];

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "d") {
                                if (parseInt(cell.v) != value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "datelessthan") {
                            //日期早于
                            let value1 = genarate(caljs["value1"])[2];

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "d") {
                                if (parseInt(cell.v) >= value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "datemorethan") {
                            //日期晚于
                            let value1 = genarate(caljs["value1"])[2];

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "d") {
                                if (parseInt(cell.v) <= value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "morethan") {
                            //大于
                            let value1 = parseFloat(caljs["value1"]);

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v <= value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "moreequalthan") {
                            //大于等于
                            let value1 = parseFloat(caljs["value1"]);

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v < value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "lessthan") {
                            //小于
                            let value1 = parseFloat(caljs["value1"]);

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v >= value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "lessequalthan") {
                            //小于等于
                            let value1 = parseFloat(caljs["value1"]);

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v > value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "equal") {
                            //等于
                            let value1 = parseFloat(caljs["value1"]);

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v != value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "noequal") {
                            //不等于
                            let value1 = parseFloat(caljs["value1"]);

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v == value1) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "include") {
                            //介于
                            let value1 = parseFloat(caljs["value1"]),
                                value2 = parseFloat(caljs["value2"]);

                            let min, max;
                            if (value1 < value2) {
                                min = value1;
                                max = value2;
                            } else {
                                max = value1;
                                min = value2;
                            }

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v < min || cell.v > max) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        } else if (value == "noinclude") {
                            //不在其中
                            let value1 = parseFloat(caljs["value1"]),
                                value2 = parseFloat(caljs["value2"]);

                            let min, max;
                            if (value1 < value2) {
                                min = value1;
                                max = value2;
                            } else {
                                max = value1;
                                min = value2;
                            }

                            if (cell == null || isRealNull(cell.v)) {
                                rowhidden[r] = 0;
                            } else if (cell.ct != null && cell.ct.t == "n") {
                                if (cell.v >= min && cell.v <= max) {
                                    rowhidden[r] = 0;
                                }
                            } else {
                                rowhidden[r] = 0;
                            }
                        }
                    }
                } else {
                    $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']").each(function(
                        i,
                        e,
                    ) {
                        if ($(e).is(":visible") && $(e).is(":checked")) {
                            return true;
                        }

                        if ($(e).closest(".day").length > 0) {
                            let day = $(e)
                                .siblings("label")
                                .text();
                            if (Number(day) < 10) {
                                day = "0" + day;
                            }

                            let month = $(e)
                                .closest(".monthBox")
                                .find(".month label")
                                .text()
                                .replace(locale_filter.filiterMonthText, "");
                            if (Number(month) < 10) {
                                month = "0" + month;
                            }

                            let year = $(e)
                                .closest(".yearBox")
                                .find(".year label")
                                .text()
                                .replace(locale_filter.filiterYearText, "");

                            let itemV = locale_filter.filterDateFormatTip + "#$$$#" + year + "-" + month + "-" + day;

                            filterdata[itemV] = "1";
                        }

                        if ($(e).closest(".textBox").length > 0) {
                            let itemV = $(e)
                                .closest(".textBox")
                                .data("filter");

                            filterdata[itemV] = "1";
                        }
                    });

                    for (let r = 1; r < d.length; r++) {
                        if (r in rowhiddenother) {
                            continue;
                        }

                        if (d[r] == null) {
                            continue;
                        }

                        let cell = d[r][cindex];

                        let value;
                        if (cell == null || isRealNull(cell.v)) {
                            value = "null#$$$#null";
                        } else if (cell.ct != null && cell.ct.t == "d") {
                            let fmt = update("YYYY-MM-DD", cell.v);
                            value = locale_filter.filterDateFormatTip + "#$$$#" + fmt;
                        } else {
                            value = cell.v + "#$$$#" + cell.m;
                        }

                        if (value in filterdata) {
                            rowhidden[r] = 0;
                        }
                    }
                }

                let $top = $("#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item").eq(
                    cindex,
                );
                if (
                    $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible:checked")
                        .length <
                        $("#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible")
                            .length ||
                    $("#luckysheet-pivotTableFilter-byvalue-input").val().length > 0 ||
                    ($("#luckysheet-pivotTableFilter-bycondition")
                        .next()
                        .is(":visible") &&
                        $("#luckysheet-pivotTableFilter-byvalue")
                            .next()
                            .is(":hidden") &&
                        $("#luckysheet-pivotTableFilter-selected span").data("value") != "null")
                ) {
                    $top.data("rowhidden", JSON.stringify(rowhidden))
                        .find(".luckysheet-slider-list-item-filtered")
                        .show();
                    _this.setDatatojsfile("rowhidden", rowhidden, cindex);

                    if (caljs != null) {
                        $top.data("byconditionvalue", caljs["value"])
                            .data("byconditiontype", caljs["type"])
                            .data("byconditiontext", caljs["text"]);

                        if (caljs["value1"] != null) {
                            $top.data("byconditionvalue1", caljs["value1"]);
                        }

                        if (caljs["value2"] != null) {
                            $top.data("byconditionvalue2", caljs["value2"]);
                        }

                        _this.setDatatojsfile("caljs", caljs, cindex);
                    }
                } else {
                    $top.data("rowhidden", "")
                        .find(".luckysheet-slider-list-item-filtered")
                        .hide();
                    _this.setDatatojsfile("rowhidden", null, cindex);
                }

                let newdata = [];
                for (let i = 0; i < d.length; i++) {
                    if (i in rowhidden || i in rowhiddenother) {
                        continue;
                    }

                    newdata.push([].concat(d[i]));
                }

                _this.celldata = newdata;
                _this.refreshPivotTable();
                $("#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu").hide();

                cleargridelement();
            });

            $(
                "#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn, #luckysheet-data-pivotTable-selection .luckysheet-modal-dialog-title-close",
            ).click(function() {
                $("#luckysheet-modal-dialog-slider-pivot").show();
                luckysheetsizeauto();
                $("#luckysheet-cell-main .luckysheet-pivotTable-selection-set div").show();

                $("#luckysheet-data-pivotTable-selection").hide();

                sheetmanage.changeSheetExec(_this.pivotSheetIndex);

                _this.luckysheet_pivotTable_select_state = false;

                cleargridelement();
            });

            $("#luckysheet-pivotTable-selection-confirm").click(function() {
                let $input = $("#luckysheet-pivotTable-range-selection-input"),
                    val = $input.val();

                if (
                    $.trim(val).length == 0 ||
                    $.trim(val).toUpperCase() == _this.jgridCurrentPivotInput.toUpperCase()
                ) {
                    $input.val(_this.jgridCurrentPivotInput);
                    $("#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn").click();
                    return;
                } else {
                    let val1 = val.split("!");
                    let sheettxt = "",
                        rangetxt = "",
                        sheetIndex = -1;

                    if (val1.length > 1) {
                        sheettxt = val1[0];
                        rangetxt = val1[1];

                        for (let i in Store.luckysheetfile) {
                            if (sheettxt == Store.luckysheetfile[i].name) {
                                sheetIndex = Store.luckysheetfile[i].index;
                                break;
                            }
                        }

                        if (sheetIndex == -1) {
                            sheetIndex = 0;
                        }
                    } else {
                        let index = getSheetIndex(Store.currentSheetIndex);
                        sheettxt = Store.luckysheetfile[index].name;
                        sheetIndex = Store.luckysheetfile[index].index;
                        rangetxt = val1[0];
                    }

                    if (Store.luckysheetfile[getSheetIndex(sheetIndex)].isPivotTable) {
                        if (isEditMode()) {
                            alert(locale_pivotTable.errorNotAllowPivotData);
                        } else {
                            tooltip.info("", locale_pivotTable.errorNotAllowPivotData);
                        }
                        $input.val(_this.jgridCurrentPivotInput);
                        return;
                    }

                    if (rangetxt.indexOf(":") == -1) {
                        if (isEditMode()) {
                            alert(locale_pivotTable.errorSelectionRange);
                        } else {
                            tooltip.info("", locale_pivotTable.errorSelectionRange);
                        }
                        $input.val(_this.jgridCurrentPivotInput);
                        return;
                    }

                    rangetxt = rangetxt.split(":");
                    let row = [],
                        col = [];

                    row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, "")) - 1;
                    row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, "")) - 1;

                    if (row[0] > row[1]) {
                        if (isEditMode()) {
                            alert(locale_pivotTable.errorSelectionRange);
                        } else {
                            tooltip.info("", locale_pivotTable.errorSelectionRange);
                        }
                        $input.val(_this.jgridCurrentPivotInput);
                        return;
                    }

                    col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, ""));
                    col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, ""));

                    if (col[0] > col[1]) {
                        if (isEditMode()) {
                            alert(locale_pivotTable.errorSelectionRange);
                        } else {
                            tooltip.info(locale_pivotTable.errorSelectionRange);
                        }
                        $input.val(_this.jgridCurrentPivotInput);
                        return;
                    }
                    sheetmanage.changeSheetExec(_this.pivotSheetIndex);

                    _this.setDatatojsfile("pivot_select_save", { row: row, column: col });
                    _this.setDatatojsfile("pivotDataSheetIndex", sheetIndex);

                    _this.getCellData(_this.pivotSheetIndex, sheetIndex, { row: row, column: col });

                    _this.initialPivotManage();

                    $("#luckysheet-dialog-pivotTable-range").html(val);

                    $("#luckysheet-modal-dialog-slider-pivot").show();

                    $("#luckysheet-data-pivotTable-selection").hide();

                    _this.luckysheet_pivotTable_select_state = false;

                    _this.refreshPivotTable();

                    luckysheetsizeauto();

                    cleargridelement();
                }
            });

            $("#luckysheet-modal-dialog-slider-pivot").on(
                "mousedown",
                ".luckysheet-slider-list-item-name, .luckysheet-modal-dialog-slider-config-item-txt",
                function(e) {
                    let $cur = $(e.target);
                    _this.movestate = true;
                    _this.movesave.obj = $cur.parent();
                    _this.movesave.name = $cur.data("name");
                    _this.movesave.containerid = $cur
                        .parent()
                        .parent()
                        .attr("id");
                    _this.movesave.index = $cur.data("index");

                    if ($("#luckysheet-modal-dialog-slider-pivot-move").length == 0) {
                        $("body").append(
                            '<div id="luckysheet-modal-dialog-slider-pivot-move">' + _this.movesave.name + "</div>",
                        );
                    }

                    _this.movesave.width = $("#luckysheet-modal-dialog-slider-pivot-move").outerWidth();
                    _this.movesave.height = $("#luckysheet-modal-dialog-slider-pivot-move").outerHeight();

                    $(
                        "#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value",
                    ).css("cursor", "default");
                },
            );

            $(
                "#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value",
            )
                .mousemove(function(e) {
                    if (_this.movestate) {
                        if (_this.moveitemposition.length == 0) {
                            _this.moveitemposition = [0];

                            $(this)
                                .find(".luckysheet-modal-dialog-slider-config-item")
                                .each(function(i) {
                                    let $t = $(this),
                                        h = $t.outerHeight();
                                    _this.moveitemposition.push(_this.moveitemposition[i] + h + 2);
                                });
                            $(this).append(
                                '<div id="luckysheet-modal-dialog-config-order-help" style="position:absolute;height:3px;width:100%;background:#007ACC;z-index:1;pointer-events: none;user-select:none;"></div>',
                            );
                        }

                        $("#luckysheet-modal-dialog-slider-pivot-move").css({
                            background: "#FD8585",
                            color: "#fff",
                            border: "1px solid #FD7070",
                        });
                        let x = event.pageX,
                            y = event.pageY,
                            $container = $(this);
                        let curtop = y - $container.offset().top + $container.scrollTop();
                        let position = _this.moveitemposition;
                        let row_index = luckysheet_searcharray(position, curtop);

                        if (row_index == -1) {
                            $("#luckysheet-modal-dialog-config-order-help").css({ top: position[position.length - 1] });
                        } else if (
                            curtop - position[row_index - 1] >
                            (position[row_index] - position[row_index - 1]) / 2
                        ) {
                            $("#luckysheet-modal-dialog-config-order-help").css({ top: position[row_index] });
                        } else {
                            $("#luckysheet-modal-dialog-config-order-help").css({ top: position[row_index - 1] });
                        }
                    }
                })
                .mouseleave(function() {
                    if (_this.movestate) {
                        $("#luckysheet-modal-dialog-slider-pivot-move").css({
                            background: "#fff",
                            color: "#000",
                            border: "1px dotted #000",
                        });
                        _this.moveitemposition = [];
                        $("#luckysheet-modal-dialog-config-order-help").remove();
                    }
                })
                .mouseup(function(e) {
                    if (_this.movestate) {
                        let $t = $(this);
                        let itemHTML;

                        if (_this.movesave.containerid == $t.attr("id")) {
                            itemHTML = _this.movesave.obj.clone();
                        } else {
                            let name = _this.movesave.name,
                                sumtype = "",
                                nameindex = "";

                            if ($t.attr("id") == "luckysheet-modal-dialog-config-value") {
                                let type = _this.pivot_data_type[_this.movesave.index.toString()];

                                if (type == "num") {
                                    name = locale_pivotTable.valueStatisticsSUM + ":" + name;
                                    sumtype = "data-sumtype='SUM'";
                                    nameindex = "data-nameindex='0'";
                                } else {
                                    name = locale_pivotTable.valueStatisticsCOUNTA + ":" + name;
                                    sumtype = "data-sumtype='COUNTA'";
                                    nameindex = "data-nameindex='0'";
                                }

                                $("#luckysheet-modal-dialog-config-value")
                                    .find(".luckysheet-modal-dialog-slider-config-item")
                                    .each(function() {
                                        if (
                                            $(this)
                                                .find(".luckysheet-modal-dialog-slider-config-item-txt")
                                                .text() == name
                                        ) {
                                            let ni = parseFloat($(this).data("nameindex")) + 1;
                                            name = name + ni.toString();
                                            $(this).data("nameindex", ni);
                                            return false;
                                        }
                                    });
                            }

                            itemHTML =
                                '<div title="' +
                                name +
                                '" class="luckysheet-modal-dialog-slider-config-item" ' +
                                nameindex +
                                " " +
                                sumtype +
                                ' data-index="' +
                                _this.movesave.index +
                                '" data-name="' +
                                _this.movesave.name +
                                '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' +
                                nameindex +
                                " " +
                                sumtype +
                                ' data-index="' +
                                _this.movesave.index +
                                '" data-name="' +
                                _this.movesave.name +
                                '">' +
                                name +
                                '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';
                        }

                        let x = event.pageX,
                            y = event.pageY,
                            $container = $(this);
                        let curtop = y - $container.offset().top + $container.scrollTop();
                        let position = _this.moveitemposition;
                        let row_index = luckysheet_searcharray(position, curtop);

                        if (
                            _this.movesave.containerid == "luckysheet-modal-dialog-pivotTable-list" ||
                            (_this.movesave.containerid == "luckysheet-modal-dialog-config-value" &&
                                _this.movesave.containerid != $t.attr("id"))
                        ) {
                            $(
                                "#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column",
                            )
                                .find(".luckysheet-modal-dialog-slider-config-item")
                                .each(function() {
                                    if ($(this).data("index") == _this.movesave.index) {
                                        $(this).remove();
                                    }
                                });
                        }

                        if (row_index == -1) {
                            if ($t.find(".luckysheet-modal-dialog-slider-config-item").length == 0) {
                                $t.append(itemHTML);
                            } else {
                                $t.find(".luckysheet-modal-dialog-slider-config-item")
                                    .last()
                                    .after(itemHTML);
                            }
                        } else if (
                            curtop - position[row_index - 1] >
                            (position[row_index] - position[row_index - 1]) / 2
                        ) {
                            $t.find(".luckysheet-modal-dialog-slider-config-item")
                                .eq(row_index - 1)
                                .after(itemHTML);
                        } else {
                            $t.find(".luckysheet-modal-dialog-slider-config-item")
                                .eq(row_index - 1)
                                .before(itemHTML);
                        }

                        if (_this.movesave.containerid == "luckysheet-modal-dialog-pivotTable-list") {
                        } else if (
                            _this.movesave.containerid == "luckysheet-modal-dialog-config-value" &&
                            _this.movesave.containerid != $t.attr("id")
                        ) {
                        } else {
                            _this.movesave.obj.remove();
                        }

                        $("#luckysheet-modal-dialog-pivotTable-list")
                            .find(".luckysheet-modal-dialog-slider-list-item")
                            .each(function() {
                                let $seleted = $(this).find(".luckysheet-slider-list-item-selected");
                                if ($(this).data("index") == _this.movesave.index && $seleted.find("i").length == 0) {
                                    $seleted.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>');
                                }
                            });

                        _this.refreshPivotTable();

                        $("#luckysheet-modal-dialog-slider-pivot-move").remove();
                        _this.movestate = false;
                        $(
                            "#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value",
                        ).css("cursor", "default");
                        _this.moveitemposition = [];
                        $("#luckysheet-modal-dialog-config-order-help").remove();
                        _this.showvaluecolrow();
                        e.stopPropagation();
                    }
                });

            $("#luckysheet-modal-dialog-pivotTable-list").on(
                "click",
                ".luckysheet-slider-list-item-selected",
                function() {
                    let $t = $(this),
                        $item = $t.parent(),
                        index = $item.data("index"),
                        name = $item.data("name");

                    if ($t.find("i").length == 0) {
                        $t.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>');

                        let type = _this.pivot_data_type[index.toString()],
                            itemHTML;

                        if (type == "num") {
                            itemHTML =
                                '<div title="' +
                                name +
                                '" class="luckysheet-modal-dialog-slider-config-item" data-nameindex="0" data-sumtype="SUM" data-index="' +
                                index +
                                '" data-name="' +
                                name +
                                '"><div class="luckysheet-modal-dialog-slider-config-item-txt" data-nameindex="0" data-sumtype="SUM" data-index="' +
                                index +
                                '" data-name="' +
                                name +
                                '">求和:' +
                                name +
                                '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';
                            $("#luckysheet-modal-dialog-config-value").append(itemHTML);
                        } else {
                            itemHTML =
                                '<div title="' +
                                name +
                                '" class="luckysheet-modal-dialog-slider-config-item" data-index="' +
                                index +
                                '" data-name="' +
                                name +
                                '"><div class="luckysheet-modal-dialog-slider-config-item-txt" data-index="' +
                                index +
                                '" data-name="' +
                                name +
                                '">' +
                                name +
                                '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';

                            let $column = $("#luckysheet-modal-dialog-config-column"),
                                $row = $("#luckysheet-modal-dialog-config-row");
                            let columnitem = $column.find(".luckysheet-modal-dialog-slider-config-item"),
                                rowitem = $row.find(".luckysheet-modal-dialog-slider-config-item");

                            if (columnitem.length < 2) {
                                $column.append(itemHTML);
                            } else if (rowitem.length < 2) {
                                $row.append(itemHTML);
                            } else {
                                $column.append(itemHTML);
                            }
                        }
                    } else {
                        $t.find("i").remove();
                        $(
                            "#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value",
                        )
                            .find(".luckysheet-modal-dialog-slider-config-item")
                            .each(function() {
                                if ($(this).data("index") == index) {
                                    if (
                                        $(this)
                                            .parent()
                                            .attr("id") == "luckysheet-modal-dialog-config-value"
                                    ) {
                                        _this.resetOrderby($(this));
                                    }
                                    $(this).remove();
                                }
                            });
                    }

                    _this.refreshPivotTable();
                    _this.showvaluecolrow();
                },
            );

            $("#luckysheet-dialog-pivotTable-clearitem").click(function() {
                $(
                    "#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value",
                )
                    .find(".luckysheet-modal-dialog-slider-config-item")
                    .each(function() {
                        $(this).remove();
                    });

                $("#luckysheet-modal-dialog-pivotTable-list")
                    .find(".luckysheet-modal-dialog-slider-list-item")
                    .each(function() {
                        $(this)
                            .find(".luckysheet-slider-list-item-selected")
                            .find("i")
                            .remove();
                    });

                _this.refreshPivotTable();
                _this.showvaluecolrow();
            });
        }

        if (restore == null) {
            restore = false;
        }

        if (_this.celldata.length <= 1 && _this.celldata[0].length <= 1) {
            if (isEditMode()) {
                alert(locale_pivotTable.errorIncreaseRange);
            } else {
                tooltip.info("", locale_pivotTable.errorIncreaseRange);
            }
        }

        let selecteditem = "",
            selecteditemIndex = 1,
            selecteditemtest = {},
            selecteditemNullIndex = 1;

        for (let i = 0; i < _this.celldata[0].length; i++) {
            let name;
            if (!!_this.celldata[0][i] && !!_this.celldata[0][i]["m"]) {
                name = _this.celldata[0][i]["m"];
            } else {
                name = getcellvalue(0, i, _this.celldata);
            }

            if (name != null) {
                name = name.toString();
            }

            if (name == null || $.trim(name.toString()).length == 0) {
                name = locale_pivotTable.titleColumn + " " + selecteditemNullIndex;
            }
            selecteditemNullIndex++;

            if (name in selecteditemtest) {
                name = name + selecteditemIndex++;
                if (name in selecteditemtest) {
                    name = name + selecteditemIndex++;
                    if (name in selecteditemtest) {
                        name = name + selecteditemIndex++;
                    }
                }
            }
            selecteditemtest[name] = 1;

            let dataother = "",
                style = "";

            if (restore && _this.filterparm != null) {
                if (_this.filterparm[i.toString()] != null) {
                    let itemset = _this.filterparm[i.toString()];
                    if (itemset.rowhidden != null) {
                        dataother += "data-rowhidden='" + JSON.stringify(itemset.rowhidden) + "'";
                    }

                    if (itemset.selected != null) {
                        dataother += "data-selected='" + JSON.stringify(itemset.selected) + "'";
                    }

                    if (itemset.caljs != null) {
                        let caljsset = itemset.caljs;
                        if (caljsset.value != null) {
                            dataother += "data-byconditionvalue='" + caljsset.value + "'";
                        }

                        if (caljsset.type != null) {
                            dataother += "data-byconditiontype='" + caljsset.type + "'";
                        }

                        if (caljsset.text != null) {
                            dataother += "data-byconditiontext='" + caljsset.text + "'";
                        }

                        if (caljsset.value1 != null) {
                            dataother += "data-byconditionvalue1='" + caljsset.value1 + "'";
                        }

                        if (caljsset.value2 != null) {
                            dataother += "data-byconditionvalue2='" + caljsset.value2 + "'";
                        }
                    }
                }
            }

            if (dataother.length > 0) {
                style = "display:block;";
            }

            selecteditem +=
                '<div class="luckysheet-modal-dialog-slider-list-item" ' +
                dataother +
                ' data-index="' +
                i +
                '" data-name="' +
                name +
                '"><div title="' +
                locale_pivotTable.titleAddColumn +
                '" class="luckysheet-slider-list-item-selected"><div></div></div><div title="' +
                locale_pivotTable.titleMoveColumn +
                '" class="luckysheet-slider-list-item-name" ' +
                dataother +
                ' data-index="' +
                i +
                '" data-name="' +
                name +
                '">' +
                name +
                '</div><div title="' +
                locale_pivotTable.titleClearColumnFilter +
                '" class="luckysheet-slider-list-item-filtered" style="' +
                style +
                '"><i class="fa fa-filter luckysheet-mousedown-cancel" aria-hidden="true"></i><i class="fa fa-times" aria-hidden="true"></i></div><div title="' +
                locale_pivotTable.titleFilterColumn +
                '" class="luckysheet-slider-list-item-filter"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';
        }
        $("#luckysheet-modal-dialog-pivotTable-list").html(selecteditem);

        $("#luckysheetpivottablevaluecolrowshow").hide();
        $("#luckysheetpivottablevaluecolrow").prop("checked", true);
        $("#luckysheetpivottablevaluecolrow1").prop("checked", false);

        $(
            "#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value",
        ).empty();

        if (restore) {
            if (_this.filter != null && _this.filter.length > 0) {
                for (let i = 0; i < _this.filter.length; i++) {
                    let item = _this.filter[i];

                    let itemHTML =
                        '<div title="' +
                        name +
                        '" class="luckysheet-modal-dialog-slider-config-item" data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '"><div class="luckysheet-modal-dialog-slider-config-item-txt" data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '">' +
                        item.name +
                        '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';

                    $("#luckysheet-modal-dialog-config-filter").append(itemHTML);

                    let $seleted = $(
                        "#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item",
                    )
                        .eq(item.index)
                        .find(".luckysheet-slider-list-item-selected");
                    if ($seleted.find("i").length == 0) {
                        $seleted.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>');
                    }
                }
            }

            if (_this.row != null && _this.row.length > 0) {
                for (let i = 0; i < _this.row.length; i++) {
                    let item = _this.row[i];
                    let otherset = "";

                    if (item.order != null) {
                        otherset += "data-order = '" + item.order + "'";
                    }

                    if (item.orderby != null) {
                        otherset += "data-orderby = '" + item.orderby + "'";
                    }

                    if (item.order != null) {
                        otherset += "data-stastic = '" + item.stastic + "'";
                    }

                    let itemHTML =
                        '<div title="' +
                        name +
                        '" class="luckysheet-modal-dialog-slider-config-item" ' +
                        otherset +
                        ' data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' +
                        otherset +
                        ' data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '">' +
                        item.name +
                        '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';

                    $("#luckysheet-modal-dialog-config-row").append(itemHTML);

                    let $seleted = $(
                        "#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item",
                    )
                        .eq(item.index)
                        .find(".luckysheet-slider-list-item-selected");
                    if ($seleted.find("i").length == 0) {
                        $seleted.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>');
                    }
                }
            }

            if (_this.column != null && _this.column.length > 0) {
                for (let i = 0; i < _this.column.length; i++) {
                    let item = _this.column[i];
                    let otherset = "";

                    if (item.order != null) {
                        otherset += "data-order = '" + item.order + "'";
                    }

                    if (item.orderby != null) {
                        otherset += "data-orderby = '" + item.orderby + "'";
                    }

                    if (item.order != null) {
                        otherset += "data-stastic = '" + item.stastic + "'";
                    }

                    let itemHTML =
                        '<div title="' +
                        name +
                        '" class="luckysheet-modal-dialog-slider-config-item" ' +
                        otherset +
                        ' data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' +
                        otherset +
                        ' data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '">' +
                        item.name +
                        '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';

                    $("#luckysheet-modal-dialog-config-column").append(itemHTML);

                    let $seleted = $(
                        "#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item",
                    )
                        .eq(item.index)
                        .find(".luckysheet-slider-list-item-selected");
                    if ($seleted.find("i").length == 0) {
                        $seleted.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>');
                    }
                }
            }

            if (_this.values != null && _this.values.length > 0) {
                for (let i = 0; i < _this.values.length; i++) {
                    let item = _this.values[i];
                    let otherset = "";

                    if (item.sumtype != null) {
                        otherset += "data-sumtype = '" + item.sumtype + "'";
                    }

                    if (item.nameindex != null) {
                        otherset += "data-nameindex = '" + item.nameindex + "'";
                    }

                    let itemHTML =
                        '<div title="' +
                        name +
                        '" class="luckysheet-modal-dialog-slider-config-item" ' +
                        otherset +
                        ' data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '"><div class="luckysheet-modal-dialog-slider-config-item-txt" ' +
                        otherset +
                        ' data-index="' +
                        item.index +
                        '" data-name="' +
                        item.name +
                        '">' +
                        _this.getSumTypeName(item.sumtype) +
                        ":" +
                        item.name +
                        '</div><div class="luckysheet-modal-dialog-slider-config-item-icon"><i class="fa fa-sort-desc" aria-hidden="true"></i></div></div>';

                    $("#luckysheet-modal-dialog-config-value").append(itemHTML);

                    let $seleted = $(
                        "#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item",
                    )
                        .eq(item.index)
                        .find(".luckysheet-slider-list-item-selected");
                    if ($seleted.find("i").length == 0) {
                        $seleted.append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>');
                    }
                }

                if (_this.values.length >= 2) {
                    $("#luckysheetpivottablevaluecolrowshow").show();
                    if (_this.showType == "column") {
                        $("#luckysheetpivottablevaluecolrow").prop("checked", true);
                        $("#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']").addClass(
                            "ui-state-active",
                        );

                        $("#luckysheetpivottablevaluecolrow1").prop("checked", false);
                        $(
                            "#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']",
                        ).removeClass("ui-state-active");
                    } else {
                        $("#luckysheetpivottablevaluecolrow1").prop("checked", true);
                        $(
                            "#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']",
                        ).addClass("ui-state-active");

                        $("#luckysheetpivottablevaluecolrow").prop("checked", false);
                        $(
                            "#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']",
                        ).removeClass("ui-state-active");
                    }
                }
            }
        }

        $("#luckysheet-dialog-pivotTable-range").html(getRangetxt(_this.pivotDataSheetIndex, _this.pivot_select_save));
        $("#luckysheet-modal-dialog-slider-pivot").show();

        luckysheetsizeauto(false);
    },
    getComposeArray: function(data) {
        if (data.length == 0) {
            return [];
        }

        let ret = [];
        for (let i = 0; i < data.length; i++) {
            let name = "";
            for (let x = 0; x <= i; x++) {
                if (!!data[x] && !!data[x]["m"]) {
                    name += data[x]["m"];
                } else {
                    name += getcellvalue(x, null, data);
                }
            }

            ret.push(name);
        }

        return ret;
    },
    getnameArray: function(data, field) {
        if (data.length == 0) {
            return [];
        }

        if (field.length == 0) {
            return [];
        }

        let ret = [];
        for (let i = 0; i < field.length; i++) {
            let c_value;
            if (!!data[field[i].index] && !!data[field[i].index]["m"]) {
                c_value = data[field[i].index]["m"];
            } else {
                c_value = getcellvalue(field[i].index, null, data);
            }

            ret.push(c_value);
        }

        return ret;
    },
    getTitleFromGroup: function(group, config, dataposition) {
        let _this = this;
        let orderbygroup = _this.orderbygroup(group, config, dataposition);

        return _this.generategrouparraymain(orderbygroup, config);
    },
    orderbygroup: function(group, config, dataposition) {
        let _this = this;

        let stackset = [];
        if (group.length == 0) {
            return [];
        }
        stackset = group;

        let d = null,
            alllength = stackset.length,
            alllengthInital = stackset.length,
            a = 0;

        while (alllength != 0) {
            d = stackset[a++];
            alllength--;

            if (d.children != null && d.children.length > 0) {
                d.children = _this.orderbygroupchildren(
                    d.children,
                    config[d.index].orderby,
                    config[d.index].order,
                    dataposition,
                );

                for (let i = 0; i < d.children.length; i++) {
                    stackset.push(d.children[i]);
                    alllength++;
                }
            }
        }

        return group.splice(0, alllengthInital);
    },
    orderbygroupchildren: function(childrens, orderby, order, dataposition) {
        if (childrens.length == 0) {
            return [];
        }

        let isAsc = false;
        if (order == null || order == "asc") {
            isAsc = true;
        }

        const _locale = locale();
        const locale_filter = _locale.filter;

        let a = function(x, y) {
            let f = null,
                s = null;

            if (orderby == "self" || orderby == null) {
                if (x.name == null) {
                    f = locale_filter.valueBlank;
                } else {
                    f = x.name.toString();
                }

                if (y.name == null) {
                    s = locale_filter.valueBlank;
                } else {
                    s = y.name.toString();
                }

                if (isdatetime(f) && isdatetime(s)) {
                    return diff(f, s);
                }
            } else {
                f = parseFloat(dataposition[x.orderby].result);
                s = parseFloat(dataposition[y.orderby].result);
            }

            if (!isNaN(f) && !isNaN(s)) {
                return numeral(f).value() - numeral(s).value();
            } else if (isNaN(f) && isNaN(s)) {
                return f.localeCompare(s);
            } else if (isNaN(f)) {
                return 1;
            } else if (isNaN(s)) {
                return -1;
            }
        };

        let d = function(x, y) {
            let f = null,
                s = null;

            if (orderby == "self" || orderby == null) {
                if (x.name == null) {
                    f = locale_filter.valueBlank;
                } else {
                    f = x.name.toString();
                }

                if (y.name == null) {
                    s = locale_filter.valueBlank;
                } else {
                    s = y.name.toString();
                }

                if (isdatetime(f) && isdatetime(s)) {
                    return diff(f, s);
                }
            } else {
                f = parseFloat(dataposition[x.orderby].result);
                s = parseFloat(dataposition[y.orderby].result);
            }

            if (!isNaN(f) && !isNaN(s)) {
                return numeral(s).value() - numeral(f).value();
            } else if (isNaN(f) && isNaN(s)) {
                return s.localeCompare(f);
            } else if (isNaN(f)) {
                return -1;
            } else if (isNaN(s)) {
                return 1;
            }
        };

        if (isAsc) {
            return childrens.sort(a);
        } else {
            return childrens.sort(d);
        }
    },
    generategroupaddstatic: function(arr, name) {
        let stasticarr = [];
        const _locale = locale();
        const locale_pivotTable = _locale.pivotTable;
        for (let a = 0; a < arr[0].length; a++) {
            if (a == 0) {
                if (name == locale_pivotTable.valueSum) {
                    stasticarr.push(name);
                } else {
                    stasticarr.push({ name: name, issum: true });
                }
            } else {
                stasticarr.push("");
            }
        }

        return stasticarr;
    },
    generategrouparraymain: function(group, config) {
        let _this = this;

        //生成数组
        let ret = [];
        for (let i = 0; i < group.length; i++) {
            let name = group[i].name;
            let arr = _this.generategrouparray(group[i].children, config, 1);

            if (config[0].stastic == "1" || config[0].stastic == null) {
                arr.push(_this.generategroupaddstatic(arr, name));
            }

            ret = ret.concat(arr);
        }

        return ret;
    },
    generategrouparray: function(group, config, level) {
        let _this = this;

        let ret = [];
        for (let i = 0; i < group.length; i++) {
            let name = group[i].name;
            let arr;

            if (group[i].children == 0 || group[i].children.length == 0) {
                arr = [name];
                ret.push(arr);
            } else {
                arr = _this.generategrouparray(group[i].children, config, level + 1);

                for (let a = 0; a < arr.length; a++) {
                    arr[a].unshift(name);
                }

                if (config[level].stastic == "1" || config[level].stastic == null) {
                    arr.push(_this.generategroupaddstatic(arr, name));
                }

                ret = ret.concat(arr);
            }
        }

        return ret;
    },
    addStatisticsData: function(dataposition, valueobj, indicator, d_value) {
        if (dataposition[indicator] == null) {
            dataposition[indicator] = {
                data: [],
                count: 0,
                max: -Infinity,
                min: Infinity,
                counta: 0,
                countunique: 0,
                countuniquedata: {},
                sum: 0,
                digitaldata: [],
                sumtype: valueobj.sumtype,
                index: valueobj.index,
                name: valueobj.fullname,
                acc: 0,
            };
        }

        if (isdatatypemulti(d_value)["num"] === true) {
            //fix issue 265
            let num = numFormat(d_value, 6);
            dataposition[indicator]["digitaldata"].push(num);
            dataposition[indicator]["count"] += 1;
            dataposition[indicator]["sum"] += num;

            if (num > dataposition[indicator]["max"]) {
                dataposition[indicator]["max"] = num;
            }

            if (num < dataposition[indicator]["min"]) {
                dataposition[indicator]["min"] = num;
            }

            let newAcc = numfloatlen(num);

            if (newAcc > dataposition[indicator]["acc"]) {
                dataposition[indicator]["acc"] = newAcc;
            }
        }

        if (d_value != "") {
            dataposition[indicator]["data"].push(d_value);
            dataposition[indicator]["counta"] += 1;
            if (!(d_value in dataposition[indicator]["countuniquedata"])) {
                dataposition[indicator]["countuniquedata"][d_value] = 1;
                dataposition[indicator]["countunique"] += 1;
            }
        }
    },
    dataHandler: function(column, row, values, showType, celldata) {
        //column:[{"index":1, name:"列1", "order":"asc", "orderby":"self/0/1/2", "stastic":"0/1"}]
        //row:[{"index":1, name:"列3", "order":"asc", "orderby":"self/0/1/2", "stastic":"0/1"}]
        //values:[{"index":1, "sumtype":"SUM/COUNT/COUNTA/COUNTUNIQUE/AVERAGE/MAX/MIN/MEDIAN/PRODUCT/STDEV/STDEVP/let/VARP", "name":"求和:fyc"}]
        let _this = this;

        const _locale = locale();
        const locale_filter = _locale.filter;
        const locale_pivotTable = _locale.pivotTable;

        if (showType == null) {
            showType = "column";
        }

        if ((column.length == 0 && row.length == 0 && values.length == 0) || celldata.length == 0) {
            _this.pivotDatas = [];
            return [];
        }

        //生成透视表值及定位
        let dataposition = {},
            data = celldata,
            datarowtitle = [],
            datarowtitlegroup = [],
            datarowposition = {},
            datarowposition_i = 0,
            datacoltitle = [],
            datacoltitlegroup = [],
            datacolposition = {},
            datacolposition_i = 0;

        for (let i = 1; i < data.length; i++) {
            let d = data[i];
            let groupbyrowtxt = "",
                groupbycoltxt = "",
                rowtxt = "",
                rowtitle = [],
                rowtitlename = [],
                coltxt = "",
                coltitle = [],
                coltitlename = [];

            //["四川", "成都", "邛崃"] 转换为 ["四川", "四川成都", "四川成都邛崃"]
            rowtitlename = _this.getnameArray(d, row);
            coltitlename = _this.getnameArray(d, column);

            rowtitle = _this.getComposeArray(rowtitlename);
            coltitle = _this.getComposeArray(coltitlename);

            if (rowtitle.length > 0) {
                rowtitle.unshift(locale_pivotTable.valueSum);
            }

            if (coltitle.length > 0) {
                coltitle.unshift(locale_pivotTable.valueSum);
            }

            let curentLevelobj_row = datarowposition,
                curentLevelarr_row = datarowtitlegroup;

            for (let r = 0; r < rowtitle.length; r++) {
                let item = rowtitle[r],
                    name = r == 0 ? locale_pivotTable.valueSum : rowtitlename[r - 1]; //修改

                if (curentLevelobj_row[r.toString()] != null && curentLevelobj_row[r.toString()][item] != null) {
                    //修改
                    curentLevelarr_row = curentLevelarr_row[curentLevelobj_row[r.toString()][item]].children;
                } else {
                    let orderby =
                        r == 0
                            ? "self"
                            : row[r - 1].orderby == "self" || row[r - 1].orderby == null
                            ? item
                            : showType == "column"
                            ? item + values[parseInt(row[r - 1].orderby)].fullname
                            : item + locale_pivotTable.valueSum;

                    if (name == null) {
                        name = locale_filter.valueBlank;
                    }

                    curentLevelarr_row.push({ name: name, fullname: item, index: r, orderby: orderby, children: [] });

                    if (curentLevelobj_row[r.toString()] == null) {
                        curentLevelobj_row[r.toString()] = {};
                    }

                    if (curentLevelobj_row[r.toString()][item] == null) {
                        curentLevelobj_row[r.toString()][item] = curentLevelarr_row.length - 1;
                    }

                    curentLevelarr_row = curentLevelarr_row[curentLevelarr_row.length - 1].children;
                }
            }

            let curentLevelobj_col = datacolposition,
                curentLevelarr_col = datacoltitlegroup;

            for (let r = 0; r < coltitle.length; r++) {
                let item = coltitle[r],
                    name = r == 0 ? locale_pivotTable.valueSum : coltitlename[r - 1];

                if (curentLevelobj_col[r.toString()] != null && curentLevelobj_col[r.toString()][item] != null) {
                    curentLevelarr_col = curentLevelarr_col[curentLevelobj_col[r.toString()][item]].children;
                } else {
                    let orderby =
                        r == 0
                            ? "self"
                            : column[r - 1].orderby == "self" || column[r - 1].orderby == null
                            ? item
                            : showType == "column"
                            ? locale_pivotTable.valueSum + item
                            : values[parseInt(column[r - 1].orderby)].fullname + item;

                    if (name == null) {
                        name = locale_filter.valueBlank;
                    }

                    curentLevelarr_col.push({ name: name, fullname: item, index: r, orderby: orderby, children: [] });

                    if (curentLevelobj_col[r.toString()] == null) {
                        curentLevelobj_col[r.toString()] = {};
                    }

                    if (curentLevelobj_col[r.toString()][item] == null) {
                        curentLevelobj_col[r.toString()][item] = curentLevelarr_col.length - 1;
                    }

                    curentLevelarr_col = curentLevelarr_col[curentLevelarr_col.length - 1].children;
                }
            }

            let v_str = "";
            for (let v = 0; v < values.length; v++) {
                let d_value = getcellvalue(values[v].index, null, d);

                let coltitle_c = [].concat(coltitle),
                    rowtitle_c = [].concat(rowtitle);
                if (showType == "column") {
                    if (coltitle_c.length > 0) {
                        coltitle_c.push("");
                        coltitle_c = coltitle_c
                            .join(values[v].fullname + "|||")
                            .split("|||")
                            .slice(0, coltitle_c.length - 1);
                    } else {
                        coltitle_c.push(values[v].fullname);
                    }
                } else {
                    if (rowtitle_c.length > 0) {
                        rowtitle_c.push("");
                        rowtitle_c = rowtitle_c
                            .join(values[v].fullname + "|||")
                            .split("|||")
                            .slice(0, rowtitle_c.length - 1);
                    } else {
                        rowtitle_c.push(values[v].fullname);
                    }
                }

                if (coltitle_c.length == 0) {
                    coltitle_c.push("");
                }

                if (rowtitle_c.length == 0) {
                    rowtitle_c.push("");
                }

                for (let r = 0; r < rowtitle_c.length; r++) {
                    for (let c = 0; c < coltitle_c.length; c++) {
                        let indicator = rowtitle_c[r] + coltitle_c[c];
                        _this.addStatisticsData(dataposition, values[v], indicator, d_value);
                    }
                }
            }
        }

        //计算值列
        //SUM/COUNT/COUNTA/COUNTUNIQUE/AVERAGE/MAX/MIN/MEDIAN/PRODUCT/STDEV/STDEVP/let/VARP
        for (let indicator in dataposition) {
            let json = dataposition[indicator];

            if (json.sumtype == "SUM") {
                json.result = json.sum;
            } else if (json.sumtype == "COUNT") {
                json.result = json.count;
            } else if (json.sumtype == "COUNTA") {
                json.result = json.counta;
            } else if (json.sumtype == "COUNTUNIQUE") {
                json.result = json.countunique;
            } else if (json.sumtype == "AVERAGE") {
                json.result = numFormat(json.sum / json.count);
            } else if (json.sumtype == "MAX") {
                json.result = json.max;
            } else if (json.sumtype == "MIN") {
                json.result = json.min;
            } else if (json.sumtype == "MEDIAN") {
                let numArr = json.digitaldata.sort(function(a, b) {
                    return a - b;
                });
                let numLen = numArr.length;
                let numindex = parseInt(numLen / 2);

                if (numLen % 2 == 0) {
                    json.result = (numArr[numindex - 1] + numArr[numindex]) / 2;
                } else {
                    json.result = numArr[numindex];
                }
            } else if (json.sumtype == "PRODUCT") {
                json.result = new Function("return " + json.digitaldata.join("*"))();
            } else if (json.sumtype == "STDEV") {
                let mean = json.sum / json.count;
                json.result = analysis.STDEV(mean, json.digitaldata);
            } else if (json.sumtype == "STDEVP") {
                let mean = json.sum / json.count;
                json.result = analysis.STDEVP(mean, json.digitaldata);
            } else if (json.sumtype == "let") {
                let mean = json.sum / json.count;
                json.result = analysis.let(mean, json.digitaldata);
            } else if (json.sumtype == "VARP") {
                let mean = json.sum / json.count;
                json.result = analysis.VARP(mean, json.digitaldata);
            }

            let newAcc = numfloatlen(json.result);
            if (newAcc > json.acc) {
                json.acc = newAcc;
            }

            json.result = numFormat(json.result, json.acc);
        }

        datarowtitle = _this.getTitleFromGroup(datarowtitlegroup, row, dataposition);
        datacoltitle = _this.getTitleFromGroup(datacoltitlegroup, column, dataposition);

        //加入值到列/行形成新的表头
        if (showType == "column") {
            if (datacoltitle.length > 0 && datacoltitle[0].length > 0) {
                datacoltitle = _this.addValuesToTitle(datacoltitle, values);
            } else {
                for (let v = 0; v < values.length; v++) {
                    datacoltitle.push([values[v].fullname]);
                }
            }
        } else {
            if (datarowtitle.length > 0 && datarowtitle[0].length > 0) {
                datarowtitle = _this.addValuesToTitle(datarowtitle, values);
            } else {
                for (let v = 0; v < values.length; v++) {
                    datarowtitle.push([values[v].fullname]);
                }
            }
        }

        let datacoltitle_index = datacoltitle;
        datacoltitle = luckysheetArray.transpose(datacoltitle, false);

        let valuenslen = values.length == 0 ? 0 : 1;
        let rowLen =
                (datacoltitle.length == 0 ? valuenslen : datacoltitle.length) +
                (datarowtitle.length == 0 ? valuenslen : datarowtitle.length),
            colLen =
                (datacoltitle.length == 0 ? valuenslen : datacoltitle[0].length) +
                (datarowtitle.length == 0 ? valuenslen : datarowtitle[0].length);

        let rowOver = datacoltitle.length,
            colOver = datarowtitle.length == 0 ? 0 : datarowtitle[0].length;

        let retdata = [];
        for (let r = 0; r < rowLen; r++) {
            retdata[r] = new Array(colLen);

            for (let c = 0; c < colLen; c++) {
                let drt = datarowtitle[r - rowOver];

                if (r < rowOver && c < colOver) {
                    //空白列头
                    retdata[r][c] = "";
                } else if (r < rowOver && c >= colOver) {
                    //列标题
                    if (datacoltitle[r] != null) {
                        if (getObjType(datacoltitle[r][c - colOver]) == "object") {
                            retdata[r][c] = datacoltitle[r][c - colOver].name + locale_pivotTable.valueSum;
                        } else {
                            retdata[r][c] = datacoltitle[r][c - colOver];
                        }
                    } else {
                        retdata[r][c] = "";
                    }
                } else if (r >= rowOver && c < colOver) {
                    //行标题
                    if (drt != null) {
                        if (getObjType(drt[c]) == "object") {
                            retdata[r][c] = drt[c].name + locale_pivotTable.valueSum;
                        } else {
                            retdata[r][c] = drt[c];
                        }
                    } else {
                        retdata[r][c] = "";
                    }
                } else {
                    //单元格内容
                    let prefix = "";
                    if (drt != null) {
                        if (!(drt instanceof Array) || drt.length == 1) {
                            if (drt instanceof Array) {
                                prefix = drt[0];
                            } else {
                                prefix = drt;
                            }
                        } else {
                            for (let x = 0; x < drt.length; x++) {
                                if (getObjType(drt[x]) == "object") {
                                    prefix += drt[x].name;
                                } else {
                                    prefix += drt[x];
                                }
                            }
                        }
                    }

                    let suffix = "";
                    let dct = datacoltitle_index[c - colOver];
                    if (dct != null) {
                        if (!(dct instanceof Array) || dct.length == 1) {
                            if (dct instanceof Array) {
                                suffix = dct[0];
                            } else {
                                suffix = dct;
                            }
                        } else {
                            for (let x = 0; x < dct.length; x++) {
                                if (getObjType(dct[x]) == "object") {
                                    suffix += dct[x].name;
                                } else {
                                    suffix += dct[x];
                                }
                            }
                        }
                    }

                    let indicator = prefix;

                    if (prefix != "" && suffix != "") {
                        indicator = prefix + suffix;
                    } else if (prefix == "") {
                        indicator = suffix;
                    }

                    if (dataposition[indicator] == null) {
                        retdata[r][c] = "";
                    } else {
                        retdata[r][c] = dataposition[indicator].result;
                    }
                }
            }
        }

        if (values.length == 1 && column.length > 0 && row.length > 0) {
            retdata[0][0] = values[0].fullname;
            retdata.splice(column.length, 1);
        } else if (values.length == 1 && column.length > 0) {
            // 0: (6) ["English", "foreign language", "mathematics", "science", "Sum", undefined]
            // 1: (6) ["CountA:score", "CountA:score", "CountA:score", "CountA:score", "CountA:score", undefined]
            // 2: (6) [3, 3, 3, 3, 12, ""]
            //The above format does not meet viewing habits,Process retdata into the correct format
            let titleRow = retdata.splice(column.length, 1);
            let newRetdata = [];
            for (let r = 0; r < retdata.length; r++) {
                let row = [];
                if (r == retdata.length - 1) {
                    row.push(titleRow[0][0]);
                } else {
                    row.push("");
                }
                for (let c = 0; c < retdata[r].length - 1; c++) {
                    row.push(retdata[r][c]);
                }
                newRetdata.push(row);
            }
            retdata = newRetdata;
        }

        _this.pivotDatas = retdata;

        return retdata;
    },
    drillDown: function(row_index, col_index) {
        if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, "usePivotTablereports")) {
            return;
        }
        let _this = this;

        let cell = _this.pivotDatas[row_index][col_index];
        let d = $.extend(true, [], sheetmanage.nulldata);

        const _locale = locale();
        const locale_filter = _locale.filter;
        const locale_pivotTable = _locale.pivotTable;

        let selecteditemNullIndex = 1;
        for (let i = 0; i < _this.celldata[0].length; i++) {
            let name;
            if (!!_this.celldata[0][i] && !!_this.celldata[0][i]["m"]) {
                name = _this.celldata[0][i]["m"];
            } else {
                name = getcellvalue(0, i, _this.celldata);
            }

            if (name != null) {
                name = name.toString();
            }

            if (name == null || $.trim(name.toString()).length == 0) {
                name = locale_pivotTable.titleColumn + " " + selecteditemNullIndex;
            }
            selecteditemNullIndex++;

            d[0][i] = name;
        }

        let obj = {};

        //行
        if (_this.row != null && _this.row.length > 0) {
            for (let a = 0; a < _this.row.length; a++) {
                obj[_this.row[a]["index"]] = _this.pivotDatas[row_index][a];
            }
        }

        //列
        if (_this.column != null && _this.column.length > 0) {
            for (let b = 0; b < _this.column.length; b++) {
                obj[_this.column[b]["index"]] = _this.pivotDatas[b][col_index];
            }
        }

        let rowArr = [];
        for (let j = 1; j < _this.celldata.length; j++) {
            let isEqual = true;

            for (let x in obj) {
                let value;
                if (!!_this.celldata[j][x] && !!_this.celldata[j][x]["m"]) {
                    value = _this.celldata[j][x]["m"];
                } else {
                    value = getcellvalue(j, x, _this.celldata);
                }

                if (value != null) {
                    value = value.toString();
                } else {
                    value = locale_filter.valueBlank;
                }

                if (value != obj[x]) {
                    isEqual = false;
                    break;
                }
            }

            if (isEqual) {
                rowArr.push(j);
            }
        }

        for (let r = 0; r < rowArr.length; r++) {
            for (let c = 0; c < _this.celldata[0].length; c++) {
                let value;
                if (!!_this.celldata[rowArr[r]][c] && !!_this.celldata[rowArr[r]][c]["m"]) {
                    value = _this.celldata[rowArr[r]][c]["m"];
                } else {
                    value = getcellvalue(rowArr[r], c, _this.celldata);
                }

                if (value != null) {
                    value = value.toString();
                } else {
                    value = "";
                }

                d[r + 1][c] = value;
            }
        }

        Store.luckysheet_select_save = [{ row: [0, rowArr.length], column: [0, _this.celldata[0].length - 1] }];

        Store.clearjfundo = false;
        jfrefreshgrid(d, Store.luckysheet_select_save);
        selectHightlightShow();
        Store.clearjfundo = true;
    },
};

export default pivotTable;
